2010-08-27 129 views

回答

1

我寧願調度Task到UI線程。您可以通過在UI線程上調用TaskScheduler.FromCurrentSynchronizationContext來獲得UI線程調度程序。 MSDN有一個例子here

我通常更喜歡基於SynchronizationContext的解決方案,而不是基於Dispatcher的解決方案,因爲它們與WPF/Silverlight沒有關係。因此,可以編寫處理同步的通用業務對象層,但可以使用WPF,ASP.NET,Windows Forms,Win32 Services等。

+0

感謝您的回答。我設法通過應用Dispatcher,SynchronizationContext和Tasks來研究多線程的不同方式。確實非常有趣。 自從.NET 2.0以來,SynchronizationContext就存在了,我對此感到有些驚訝,但我不知道它。我總是使用這個經典控件。自從我完成了微軟的MCPD證書,他們根本就沒有在他們的材料中教授這一點。用於線程同步的TaskScheduler僅在.NET 4.0中可用,是否正確?這也可以通過手動方式來完成,對嗎? – Houman 2010-08-31 12:08:13

+0

不幸的是,.NET 1時代的MSDN文檔推薦'Control.Invoke'仍然繼承到.NET 4.0中,所以大多數人都沒有意識到優越的'SynchronizationContext'。作爲[Rx庫](http://msdn.microsoft.com/zh-cn/devlabs/ee794896.aspx)的一部分,TaskScheduler已被移植到.NET 3.5。不,'ManualResetEvent'用於* synchronization *,而'SynchronizationContext'(儘管名稱)實際上用於*調度*工作到其他上下文。您不能使用'ManualResetEvent'在UI線程上運行委託。 – 2010-08-31 13:49:47

+0

順便說一句,我已經在[我的博客](http://nitoprograms.com/)上的[Threading標籤](http://nitoprograms.blogspot.com/search/label)下寫了很多關於'SynchronizationContext'的內容/線程)。 – 2010-08-31 13:53:46