ConfigureAwait(false)
是否保证继续运行在不同的线程上,或只表示它不是强制运行在同一线程上?如何保证异步方法继续在另一个线程上运行?
有没有什么方法可以提供保证?
我需要跨线程测试上下文流。
ConfigureAwait(false)
是否保证继续运行在不同的线程上,或只表示它不是强制运行在同一线程上?如何保证异步方法继续在另一个线程上运行?
有没有什么方法可以提供保证?
我需要跨线程测试上下文流。
使用ConfigureAwait(false)
告诉服务员不要在捕获的上下文中恢复,因此SynchronizationContext
被忽略。这意味着继续将安排使用ThreadPool
线程的默认TaskScheduler
。
如果原始线程为ThreadPool
线程,则继续可能在同一线程上运行,否则您保证它是不同的线程。
您可以使用没有SynchronizationContext
(或ConfigureAwait(false)
)的专用线程开始测试,以确保线程在async
操作前后不同。
下面的情景ConfigureAwait(false)
没有运行新的上下文。
Task task2Seconds = Wait2Seconds();
Task task5Seconds = Wait5Seconds();
await task5Seconds;
await task2Seconds.ConfigureAwait(false);
第一await
不具有ConfigureAwait(false)
但它需要更长的时间比第二await
谁拥有配置,但随时准备恢复提前。所以第二个会在同一个环境中恢复。
该任务也可以在同一个线程上同步完成,在这种情况下'ConfigureAwait(false)'什么都不做。国际海事组织,获得保证的最简单方法是使用自定义服务器(而不是'ConfiguredTaskAwaitable')。 – Noseratio 2014-12-04 10:04:36
@Noseratio谢谢你的评论。我完全忘记了这种可能性。 – 2014-12-04 11:36:33
没问题;总的来说,我不会指望'ConfigureAwait(false)'不仅仅是一种优化,以避免重复的上下文切换。请注意[MSDN文档说](http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.configureawait%28v=vs.110%29.aspx):* true试图将续集编组回到原始上下文;否则为false。*超出该语句的任何其他行为都将被记录为非文档,并且可能是版本特定的。 – Noseratio 2014-12-04 12:06:03