我在 4.5 中遇到了一些异步代码的死锁问题。我阅读了Stephen Cleary 的博客,内容是防止在任务捕获执行上下文时发生死锁,然后在您通过等待任务阻塞的同一上下文中发生死锁。我试图实施该解决方案,但我仍然遇到死锁,我不明白为什么。
原始代码
消费类:
private void Update(...)
{
//... do some stuff ...
_repository.Save(listing).Wait();
}
返回任务的类:
protected override Task Save(...)
{
return Task.Run(() =>
{
... do some stuff ...
_logger.Debug("All Done!!!");
});
}
修改后的代码
消费类:
private void Update(...)
{
//... do some stuff ...
_repository.Save(listing).Wait();
}
返回任务的类:
protected override async Task Save(...)
{
await Task.Run(() =>
{
... do some stuff ...
_logger.Debug("All Done!!!");
}).ConfigureAwait(false);
}
即使在修改后的版本中,我明确告诉等待的任务不要绑定到上下文,我仍然会遇到死锁。
任何想法可能会发生什么?