如何在后台线程中更新 BindingList<>?

4

我想知道如何在WPF中使用Dispatcher来安全地从另一个线程更新我的BindingList集合。

我也愿意接受其他解决方案,

非常感谢,Kave

1个回答

2
我更喜欢将“Task”调度到UI线程。您可以在UI线程上调用“TaskScheduler.FromCurrentSynchronizationContext”来获取UI线程调度程序。MSDN有一个示例here
我通常更喜欢基于“SynchronizationContext”的解决方案,而不是基于“Dispatcher”的解决方案,因为它们不与WPF / Silverlight绑定。因此,可以编写一个通用的业务对象层来处理同步,但可以从WPF、ASP.NET、Windows Forms、Win32服务等中使用。

谢谢你的回答。我通过应用Dispatcher、SynchronizationContext和Tasks来学习了多线程的不同方式,这确实非常有趣。我有点惊讶SynchronizationContext自.NET 2.0以来就存在了,而我却不知道它的存在。在这方面,我总是使用经典的control.Invoke。更令人惊讶的是,我曾经获得过微软的MCPD证书,但他们根本没有教授这个知识。Thread synchronization的TaskScheduler只在.NET 4.0中可用,对吗?这也可以通过manualresetevent来替代完成,对吗? - Houman
遗憾的是,.NET 1时代的MSDN文档推荐使用Control.Invoke,这种做法一直延续到了.NET 4.0,因此大多数人并不知道更优秀的SynchronizationContextTaskScheduler已经作为Rx库的一部分被移植到了.NET 3.5中。而且,ManualResetEvent用于同步,而SynchronizationContext(尽管名字中有“同步”)实际上用于在其他上下文中调度工作。你不能使用ManualResetEvent在UI线程上运行委托。 - Stephen Cleary
顺便提一下,我在我的博客上写了很多关于SynchronizationContext的内容,可以在Threading标签下找到。 - Stephen Cleary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接