StaTaskScheduler并等待继续

avo*_*avo 3 .net c# multithreading task-parallel-library async-await

StaTaskScheduler由于这里描述的原因,我正在使用Stephen Toub .

据我所知,任务调度是任务调度程序的责任,而await延续是同步上下文的责任(如果我错了,请纠正我).

现在我想await在我的任务代码中使用,在其中一个STA线程上运行StaTaskScheduler.我应该安装自定义同步上下文,以确保代码执行将在同一个 STA线程之后继续await吗?

Ste*_*ary 5

await博客文章的介绍中介绍了async这种行为.

默认情况下,除非await捕获电流,SynchronizationContext 否则它将null捕获电流,在这种情况下它将捕获电流TaskScheduler.

所以答案是否定的,你不需要安装自定义SynchronizationContext.当在由执行的任务内部使用时StaTaskScheduler,await将默认捕获该任务调度程序并恢复由该执行的另一个任务StaTaskScheduler.

注意,StaTaskScheduler它确实维护了STA线程的集合,并且延续可以在任何这些线程上执行.如果这是不可接受的,则需要将其限制StaTaskScheduler为单个线程(通过传递1给它的构造函数).

  • 这在"SynchronizationContext"级别无法解决.当您安装`SynchronizationContext`时,您实际上是在说您控制该线程的核心循环.但在这种情况下,你没有; 核心循环在`StaTaskScheduler`中,它不支持线程关联.在你的案例AFAIK中最干净的解决方案是编写自己的类型,维护一个`StaTaskScheduler`池,每个包含一个线程. (2认同)