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,则尝试将延续封送回捕获的原始上下文;否则,错误。该语句之外的任何其他行为都将是未记录的,并且可能是特定于版本的。