我更喜欢将“Task”调度到UI线程。您可以在UI线程上调用“TaskScheduler.FromCurrentSynchronizationContext”来获取UI线程调度程序。MSDN有一个示例here。我通常更喜欢基于“SynchronizationContext”的解决方案,而不是基于“Dispatcher”的解决方案,因为它们不与WPF / Silverlight绑定。因此,可以编写一个通用的业务对象层来处理同步,但可以从WPF、ASP.NET、Windows Forms、Win32服务等中使用。
Control.Invoke
,这种做法一直延续到了.NET 4.0,因此大多数人并不知道更优秀的SynchronizationContext
。TaskScheduler
已经作为Rx库的一部分被移植到了.NET 3.5中。而且,ManualResetEvent
用于同步,而SynchronizationContext
(尽管名字中有“同步”)实际上用于在其他上下文中调度工作。你不能使用ManualResetEvent
在UI线程上运行委托。 - Stephen ClearySynchronizationContext
的内容,可以在Threading标签下找到。 - Stephen Cleary