我仍然在学习整个任务-概念和第三方物流。据我目前的理解,SynchronizationContext函数(如果存在的话)被await用于“某个地方”分派任务。另一方面,Task类中的函数不使用上下文,对吗?
因此,例如,Task.Run(...)将始终在线程池的工作线程上分派操作,并完全忽略SynchronizationContext.Current。await Foobar()将使用上下文在await之后执行生成的任务。
如果是这样的话,我的问题是:我如何获得一个Task,它实际上运行一个操作,但使用SynchronizationContext.Current.Send/Post进行分派?
有谁能推荐SynchronizationContext的一个很好的介绍,特别是框架的其他部分使用它们的时间和方式?MSDN似乎对这门课很安静。最大的谷歌点击量(这里和这里)似乎只适合Windows的发布。Stephen写了文章,它很好地了解了已经存在的上下文以及它们是如何工作的,但是我不知道它们在什么地方和什么时候被实际使用。
发布于 2013-06-04 11:19:07
如何获得一个任务,该任务实际上运行一个操作,但使用SynchronizationContext.Current.end/Post分派?
使用特殊任务调度程序:
Task.Factory.StartNew(
() => {}, // this will use current synchronization context
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());有谁能推荐一个很好的SynchronizationContext入门吗?
请看Stephen的文章http://msdn.microsoft.com/en-us/magazine/gg598924.aspx。
发布于 2013-06-04 12:02:40
在您学习这一点时,必须指出,TPL使用的Task与异步/等待时使用的Task非常不同,尽管它们是相同的类型。例如,TPL通常使用父/子任务,但async/await不使用。
TPL使用任务调度程序来执行其任务。正如丹尼斯所指出的,TaskScheduler.FromCurrentSynchronizationContext将为您提供一个任务调度程序,它在当前SynchronizationContext上使用Post来执行其任务。
async/await通常不使用任务调度程序。我的博客上有一个介绍性的帖子,其中包括上下文信息,我还在我的MSDN文章中简要地提到了它(不过很容易忽略)。本质上,当async方法在await处挂起时,默认情况下它将捕获当前的SynchronizationContext (除非是null,在这种情况下,它将捕获当前的TaskScheduler)。当async方法恢复时,它将在该上下文中继续执行。
Dennis指出了TPL将任务调度到当前SynchronizationContext的方法,但是在async/await世界中,这种方法是不必要的。相反,您可以通过Task.Run显式地将任务调度到线程池中。
async Task MyMethodAsync()
{
// Whee, on a SynchronizationContext here!
await Task.Run(() => { }); // Ooo, on the thread pool!
// Back on the SynchronizationContext ...
// ... automagically!
}我写SynchronizationContext文章正是因为MSDN文档太缺乏了。我有一个在我的博客上没有更多的信息,但是所有重要的部分都在MSDN文章中。许多类型直接使用AsyncOperation而不是SynchronizationContext;最好的文档是埋在EAP文档下(“线程和上下文”部分)。但是我也应该指出,由于async/await,EAP实际上已经过时了,所以我不会使用AsyncOperation (或SynchronizationContext)编写代码--除非我实际上是在编写自己的SynchronizationContext。
https://stackoverflow.com/questions/16916253
复制相似问题