c# - 我可以安全地绑定(bind)到多线程应用程序上的数据吗?

标签 c# multithreading data-binding

我正在尝试解决一个经典问题 - 我有一个多线程应用程序运行一些 处理器密集型计算,带有 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.FromCurrentSynchronizationContextTask 来完成。

如果您还没有使用 .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/

相关文章:

JavaFX 列表数据绑定(bind)

c# - 在 C# 中处理所有异常的最简洁方法

c# - 调用卡住我的 Windows 窗体

java - 使用 Handler 在 EDT 和其他 Java 线程之间传递信息

ios - 将方法标记为主线程?

c# - WPF 使用类和子类绑定(bind)到 DataContext

安卓 MVVM : cannot generate view binders

c# - 将任何用户输入添加为 XML 文档中的节点

c# - 为什么会出现 System.TypeInitializationException 以及如何修复它?

c# - 向空的 ASP.NET SignalR 组广播会浪费资源吗?