2014-12-04 66 views
5

ConfigureAwait(false)是否保证继续运行在不同的线程上,或只表示它不是强制运行在同一线程上?如何保证异步方法继续在另一个线程上运行?

有没有什么方法可以提供保证?

我需要跨线程测试上下文流。

+3

该任务也可以在同一个线程上同步完成,在这种情况下'ConfigureAwait(false)'什么都不做。国际海事组织,获得保证的最简单方法是使用自定义服务器(而不是'ConfiguredTaskAwaitable')。 – Noseratio 2014-12-04 10:04:36

+1

@Noseratio谢谢你的评论。我完全忘记了这种可能性。 – 2014-12-04 11:36:33

+0

没问题;总的来说,我不会指望'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

回答

8

使用ConfigureAwait(false)告诉服务员不要在捕获的上下文中恢复,因此SynchronizationContext被忽略。这意味着继续将安排使用ThreadPool线程的默认TaskScheduler

如果原始线程为ThreadPool线程,则继续可能在同一线程上运行,否则您保证它是不同的线程。

您可以使用没有SynchronizationContext(或ConfigureAwait(false))的专用线程开始测试,以确保线程在async操作前后不同。

0

下面的情景ConfigureAwait(false)没有运行新的上下文。

Task task2Seconds = Wait2Seconds(); 
Task task5Seconds = Wait5Seconds(); 

await task5Seconds; 
await task2Seconds.ConfigureAwait(false); 

第一await不具有ConfigureAwait(false)但它需要更长的时间比第二await谁拥有配置,但随时准备恢复提前。所以第二个会在同一个环境中恢复。

相关问题