2010-08-11 59 views
0

我正在使用MVVM方法編寫WPF應用程序。在我的ViewModel中,我有一個ObservableCollection。我的應用程序需要定期檢查新消息,如果有消息,它需要將它們添加到ObservableCollection中。可以使用BackgroundWorker的ReportProgress來做其他事情嗎?

如果我嘗試添加到DoWork中的ObservableCollection,由於線程同步問題,它不起作用。看起來在UI線程中發生這種情況的最簡單方法是執行ReportProgress()並從那裏更新集合。

我的問題是:哲學上和技術上,可以從ReportProgress處理程序更新UI,即使「通過法律信函」我並沒有實際報告進度。

有沒有更好的方法來做到這一點?

*編輯:代碼工作使用Dispatcher定時器*

視圖模型

class MyViewModel 
{ 
    public ObservableCollection<string> MyList { get; set; } 

    public MyViewModel() 
    { 
     MyList = new ObservableCollection<string>(); 
    } 
} 

「德codez」 - 只是一個樣本,而不是我的實際應用程序代碼。

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

     MyViewModel mvm = new MyViewModel(); 
     this.DataContext = mvm; 

     DispatcherTimer mytimer = new DispatcherTimer(); 
     mytimer.Interval = TimeSpan.FromSeconds(5.0); 
     mytimer.Tick += new EventHandler(mytimer_Tick); 

     mytimer.Start(); 


    } 

    void mytimer_Tick(object sender, EventArgs e) 
    { 
     ((DispatcherTimer)sender).Stop(); 

     MyViewModel mvm = this.DataContext as MyViewModel; 
     mvm.MyList.Insert(0, DateTime.Now.ToLongTimeString()); 

     ((DispatcherTimer)sender).Start(); 
    } 

這看起來像它會爲我所需要的工作很好,不給我,我不會使用額外的行李(例如取消,workercompleted等)。

回答

1

當然。這就是EventArgs的UserState的設計目的。

的原因BackgroundWorker的是簡化多線程。否則,您必須執行一些類似Invoke(或BeginInvoke)的操作來處理BackgroundWorker所用的相同內容。

1

我不會做它

「感覺」喜歡的東西,這將導致在未來的(也許當別人試圖從現在添加功能年的問題,說不定什麼時候該代碼升級或移植到環境稍有不同ReportProgress實施)。我只是使用Dispatcher.BeginInvoke(我也嘗試避免使用Invoke,因爲它使一個線程等待另一個線程,並降低首先使用多線程的效率)。

但是,有些地方只是使用ReportProgress是正確的選擇,你需要自己決定什麼是最適合你的具體情況(我最討厭的是評估「最佳實踐」或「架構」更多然後生產實際工作的軟件)

+0

我不確定我是否同意它「感覺」髒。這聽起來像他正在使用它來完成特定的任務。而且,原來的問題是,它是否是確定更新從ReportProgress處理程序的UI - 我說是的,不僅是因爲這是什麼BackgroundWorker的(和ReportProgress事件處理程序)是爲設計 - 一種簡化的方式來acheive多線程同時更新用戶界面。再一次,你在YMMV中肯定是正確的。 – 2010-08-11 13:11:16

+1

+1爲工作軟件評論。如果MSFT的API人員決定將其稱爲「UpdateUI」或「ThreadSynchronizer」,我會更加高興,但他們使API方法簽名非常單一。我會將問題留待更多天,並看看是否有其他人蔘與。感謝迄今的建議。 – Robaticus 2010-08-11 13:28:16

相關問題