我正在尝试解决一个经典问题 - 我有一个多线程应用程序运行一些 处理器密集型计算,带有 GUI 界面。
每当其中一个线程完成一项任务时,我想 更新表格的状态
任务ID |状态
我按以下方式使用 DataGridView 和 BindingList:
BindingList<Task> tasks;
dataGridView.DataSource = tasks
public class Task : INotifyPropertyChanged
{
ID{get;}
Status{get;set;}
}
后台线程能否安全地更新任务的状态? 并在 GUI 中以正确的顺序看到更改?
第二个问题: 我什么时候需要调用 PropertyChanged? 我试着在有电话和没有电话的情况下运行,似乎没有打扰..
第三个问题: 我在 MSDN 上看到 dataGridView 使用 BindingSource 作为 DataGridView.DataSource 和 BindingList 之间的中介 这真的有必要吗?
最佳答案
1 - 否。后台任务必须在更新数据绑定(bind)属性之前同步到 UI 线程。这可以通过使用计划到 TaskScheduler.FromCurrentSynchronizationContext
的 Task
来完成。
如果您还没有使用 .NET 4.0(例如,Task
不可用),那么这取决于您的“任务”如何运行:具有“完成”概念的任务可以使用BackgroundWorker
,无限期运行的任务可以使用SynchronizationContext.Post
。
2 - PropertyChanged
由绑定(bind)用于更新其显示。不知道为什么它不调用它就对你有用......
3 - BindingSource
提供各种功能;见What Is a BindingSource and Why Do I Need It?
顺便说一句:欢迎您就 SO 提出不止一个问题。这一个问题实际上应该是三个。
关于c# - 我可以安全地绑定(bind)到多线程应用程序上的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2874482/