【发布时间】:2016-12-07 07:36:17
【问题描述】:
我遇到了挂起等待的问题(描述为here)。在研究期间,我发现在我的TaskCompletionSource 上调用SetResult 实际上会在调用SetResult 的线程的上下文中调用等待继续(这在this answer 中也有一些相关的问题)。在我的例子中,这是一个与启动 await 的线程(一个 ASP.NET 请求线程)不同的线程(一个线程池工作线程)。
虽然我仍然不确定为什么这会导致挂起,但我决定尝试将 SetResult 强制转换为原始上下文。我在请求线程上进入等待之前存储了SynchronizationContext.Current 的值,并在调用SetResult 之前通过SynchronizationContext.SetSynchronizationContext 在工作线程中手动应用它。这解决了问题,我现在可以等待所有异步方法,而无需指定 ConfigureAwait(false)。
我的问题是:这是手动捕获和应用SynchronizationContext 的合理且正确的方法吗? FWIW,我尝试先用SetResult 代表做一个简单的Post(),但这仍然导致挂起。我显然有点脱离了我的舒适区......请帮助我了解发生了什么!
【问题讨论】:
标签: c# multithreading asynchronous async-await