如何保证异步方法延续在另一个线程上运行?

时间:2014-12-04 09:18:33

标签: c# .net unit-testing async-await

ConfigureAwait(false)是否保证延续在不同的线程上运行,或仅表示它不是必须在同一个线程上运行?

有没有办法提供这种保证?

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

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:0)

以下情况ConfigureAwait(false)没有运行新的上下文。

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

await task5Seconds;
await task2Seconds.ConfigureAwait(false);

第一个await没有ConfigureAwait(false),但是它需要比配置但准备好提前恢复的第二个await更长的时间。所以第二个将在相同的背景下恢复。