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

Pau*_*aul 1 c# data-binding multithreading

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

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

taskID | 状态

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

BindingList<Task> tasks;
dataGridView.DataSource = tasks

public class Task : INotifyPropertyChanged
{
    ID{get;}
    Status{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ste*_*ary 5

1 - 否.在更新数据绑定属性之前,后台任务必须与UI线程同步.这可以通过使用Task预定来完成TaskScheduler.FromCurrentSynchronizationContext.

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

2 - PropertyChanged绑定用于更新其显示.不知道为什么它没有调用它为你工作...

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

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