C# 如何保证异步方法继续在另一个线程上运行?
C# 如何保证异步方法继续在另一个线程上运行?,c#,.net,unit-testing,async-await,C#,.net,Unit Testing,Async Await,ConfigureAwait(false)是否保证continuation在不同的线程上运行,或者只表示continuation不是必须在同一线程上运行 有没有办法提供这种保证 我需要测试线程间的上下文流。使用ConfigureAwait(false)告诉等待程序不要在捕获的上下文上恢复,因此SynchronizationContext被忽略。这意味着将由使用ThreadPool线程的默认TaskScheduler调度继续 如果原始线程是ThreadPool线程,则继续可能会运行在同一线程上,否
ConfigureAwait(false)
是否保证continuation在不同的线程上运行,或者只表示continuation不是必须在同一线程上运行
有没有办法提供这种保证
我需要测试线程间的上下文流。使用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)
什么也不做。在我看来,获得您想要的保证的最简单方法是使用自定义等待器(而不是配置为askawaitable
)。@noserratio感谢您的评论。我完全忘记了这种可能性。没问题;总的来说,我认为ConfigureAwait(false)
只是一种避免冗余上下文切换的优化。注意:如果为true,则尝试将延续封送回捕获的原始上下文;否则,错误。该语句之外的任何其他行为都将是未记录的,并且可能是特定于版本的。