ConfigureAwait(false)
是否保证延续在不同的线程上运行,或仅表示它不是必须在同一个线程上运行?
有没有办法提供这种保证?
我需要跨线程测试上下文流。
答案 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
更长的时间。所以第二个将在相同的背景下恢复。