我可以安全地绑定到multithreading应用程序上的数据吗?

我正在尝试解决一个经典问题 – 我有一个multithreading应用程序,它运行一些处理器密集型计算,带有GUI界面。

每当其中一个线程完成一项任务时,我就想更新一个表上的状态

taskID | 状态

我以下列方式使用DataGridView和BindingList:

BindingList tasks; dataGridView.DataSource = tasks public class Task : INotifyPropertyChanged { ID{get;} Status{get;set;} } 

后台线程可以安全地更新任务的状态吗? GUI中会以正确的顺序看到更改吗?

第二个问题:我什么时候需要致电PropertyChanged? 我试着在有和没有通话的情况下跑步,似乎没有打扰..

第三个问题:我在MSDN上看到dataGridView使用BindingSource作为DataGridView.DataSource和BindingList之间的中介这真的有必要吗?

1 – 否。在更新数据绑定属性之前,后台任务必须与UI线程同步。 这可以通过使用调度到TaskScheduler.FromCurrentSynchronizationContextTask来完成。

如果你还没有使用.NET 4.0(例如, Task不可用),那么它取决于你的“任务”如何运作:具有“完成”概念的任务可以使用BackgroundWorker ,并且任务可以无限期运行可以使用SynchronizationContext.Post

2 – 绑定使用PropertyChanged来更新其显示。 不知道为什么它没有调用它为你工作…

3 – BindingSource提供各种function; 看什么是绑定源以及我为什么需要它?

顺便说一句:欢迎您在SO上提出一个以上的问题。 这个问题应该是三个问题。

如果您一次只运行一个后台任务,BackgroundWorker可以解决您的问题,您可以使用WorkCompleted事件来更新您的UI。 否则,如果有多个线程正在使用Control.BeginInoke来解决您的更新UI问题,那么在WPF上它将是Dispatcher.BeginInvoke。

propertyChanged在您的属性集上调用。 但是如果你使用集合作为BindingObject,我会使用ObservableCollection。