2012-05-02 83 views
1

在任務中運行的代碼之間的區別,計劃在UI線程的同步上下文上運行,而代碼則直接在消息泵上運行。計劃在UI線程vs UI上運行的TPL任務線程

我注意到一些行爲差異。

+1

你能舉出一些示例代碼,以及你已經注意到的例子嗎? –

+0

1)如果沿着「UI」任務運行的某個地方,它會調用TaskScheduler.FromCurrentSynchronizationContext()來創建另一個任務。該新任務不會在UI線程上運行。 –

+0

2)如果System.ComponentModel.BackgroundWorker.RunWorkerAsync()從「UI」任務執行,那麼它的RunWorkerCompleted事件不會在UI線程中引發。 –

回答

1

不知道你的「代碼直接在消息泵運行」,但看着參考源,你可以看到的意思,基本上

WindowsFormsSynchronizationContext.Send = Control.Invoke WindowsFormsSynchronizationContext.Post = Control.BeginInvoke DispatcherSynchronizationContext.Send = Dispatcher.Invoke DispatcherSynchronizationContext.Post = Dispatcher.BeginInvoke

所以當任務調度程序在UI線程上調度一個任務時,它應該等於你這麼做

+0

我想如果你從UI任務內部調用例如TaskScheduler.FromCurrentSynchronizationContext(),它真的不知道它是WinForm還是Dispatcher實現它?可能它只是返回默認的SynchronizationContext ... –

+0

'TaskScheduler.FromCurrentSynchronizationContext()'使用'SynchronizationContext.Current',它反過來從當前正在運行的線程中獲取它:'Thread.CurrentThread.GetExecutionContextNoCreate()。SynchronizationContext' –