我可能忽略了一些显而易见的东西,比如SynchronizationContext
上的死锁,但我不知道为什么会发生这种情况,并且不知道如何避免它...
所以,这个应用程序是Azure WorkerRole(本质上,据我理解,是没有UI的常规Windows应用程序)。在应用程序中,我正在尝试并行执行多个任务,我的代码的示意版本如下:
private async Task DoJob()
{
await SomeIoOperation();
}
public void MethodExecutedByWorkerRoleInAnInfiniteLoop()
{
Log("Start");
Task.WaitAll(DoJob(), DoJob(), DoJob());
Log("End");
}
我的想法是,我们在这里使用默认的SynchronizationContext
,因此我们应该避免死锁,就像在ASP.NET等类似情况下一样。
然而,有时候执行会挂起 - Start被记录,但End要等好几天才能看到,除非我重新启动worker role。自然地,DoJob不可能运行那么长时间。奇怪的是,这并不是在worker role启动后立即发生的 - 可能需要数天或数周的正常操作才会挂起。
我可能过于简化了代码 - 也许SomeIoOperation
中发生的确切事情很重要 - 但我感觉这与SynchronizationContext
的误用有关,显而易见。
SomeIoOperation.ConfigureAwait(false)
有帮助吗?我甚至无法测试它,因为我不知道它是否有效,问题是否已经解决,或者是否还会在未来几天内挂起。
有什么想法吗?
Log(SynchronizationContext.Current);
,如果它不是null
,那么你就会知道你在SynchronizationContext
上有问题。 - i3arnonDoJob
将始终希望与调用上下文同步。SomeIoOperation
使用哪个上下文并不重要。 - Gusdor