2012-05-02 51 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' –