当前位置: 首页 > 编程语言 > C#

如何使用SynchronizationContext获取任务?那么SynchronizationContext是如何使用的呢?分享

时间:2023-04-10 17:59:43 C#

如何使用SynchronizationContext获取任务?那么SynchronizationContext是如何使用的呢?我仍在学习整个任务概念和TPL。根据我目前的理解,await使用SynchronizationContext函数(如果存在)来“调用”任务“某处”。另一方面,Task类中的函数不使用上下文,对吗?因此,例如,Task.Run(...)将始终在线程池的工作线程上安排操作,并完全忽略SynchronizationContext.Current。awaitFoobar()会在await之后使用上下文来执行结果任务吗?如果这是真的,我的问题是:如何获得实际运行操作但使用SynchronizationContext.Current.Send/Post安排的任务?任何人都可以推荐对SynchronizationContexts的一个很好的介绍,特别是框架的其余部分何时以及如何使用它们?MSDN似乎对这个类非常安静。Google的热门点击(此处和此处)似乎仅适用于Windows窗体调度。StephenCleary写了一篇文章,很好地了解了已经存在的背景及其工作原理,但我不明白它们实际使用的地点和时间。如何让任务实际运行操作但使用SynchronizationContext.Current.Send/Post安排它?使用特殊任务调度程序:Task.Factory.StartNew(()=>{},//这将使用当前同步上下文CancellationToken.None,TaskCreationOptions.None,TaskScheduler.FromCurrentSynchronizationContext());谁能推荐一个好的SynchronizationContext的介绍,看StephenCleary关于SynchronizationContext的文章。当您理解这一点时,重要的是要指出TPL使用的Task与async/await使用的Task完全不同,即使它们是同一类型。例如,TPL通常使用parent/child任务,但async/await不使用。TPL使用任务调度程序来执行其任务。正如丹尼斯指出的那样,TaskScheduler.FromCurrentSynchronizationContext将为您提供一个任务调度程序,它使用当前SynchronizationContext上的Posts来执行其任务。async/await通常不使用任务调度程序。我的博客上有一篇介绍性的async/await帖子,其中包含上下文信息,我还在MSDN文章中简要提及(尽管很容易被忽视)。本质上,当异步方法等待等待时,默认情况下它将捕获当前的SynchronizationContext(除非它为null,在这种情况下它将捕获当前的TaskScheduler)。当异步方法恢复时,它将继续在该上下文中执行。Dennis指出了将任务调度到当前SynchronizationContext的TPL方式,但在async/await世??界中,这种方式不是必需的。相反,您可以通过Task.Run将任务显式调度到线程池:asyncTaskMyMethodAsync(){//Whee,在SynchronizationContext上!awaitTask.Run(()=>{});//哦,在线程池上!//回到SynchronizationContext...//...自动!我刚刚写了我的SynchronizationContext文章,因为MSDN文档非常缺乏。我的博客上有更多信息,但所有重要部分都在MSDN文章中。许多类型直接使用AsyncOperation而不是SynchronizationContext;最好的文档藏在EAP文档下(“线程和上下文”部分)。但我还应该指出,由于async/await,EAP实际上已过时,因此我不会使用AsyncOperation(或SynchronizationContext)编写代码-除非我实际编写自己的SynchronizationContext。以上是C#学习教程:HowtogettasksthatuseSynchronizationContext?那么SynchronizationContext是如何使用的呢?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: