C# Task.Run返回的任务上的Task.Wait死锁
我在4.5中遇到了一些异步代码的死锁问题。然后我在同样的背景下读到了你等待任务而阻碍的内容。我试图实现这个解决方案,但我仍然遇到了僵局,我不知道为什么 原始代码 消费类:C# Task.Run返回的任务上的Task.Wait死锁,c#,.net,asynchronous,.net-4.5,async-await,C#,.net,Asynchronous,.net 4.5,Async Await,我在4.5中遇到了一些异步代码的死锁问题。然后我在同样的背景下读到了你等待任务而阻碍的内容。我试图实现这个解决方案,但我仍然遇到了僵局,我不知道为什么 原始代码 消费类: private void Update(...) { //... do some stuff ... _repository.Save(listing).Wait(); } private void Update(...) { //... do som
private void Update(...)
{
//... do some stuff ...
_repository.Save(listing).Wait();
}
private void Update(...)
{
//... do some stuff ...
_repository.Save(listing).Wait();
}
类返回任务:
protected override Task Save(...)
{
return Task.Run(() =>
{
... do some stuff ...
_logger.Debug("All Done!!!");
});
}
protected override async Task Save(...)
{
await Task.Run(() =>
{
... do some stuff ...
_logger.Debug("All Done!!!");
}).ConfigureAwait(false);
}
修改代码
消费类:
private void Update(...)
{
//... do some stuff ...
_repository.Save(listing).Wait();
}
private void Update(...)
{
//... do some stuff ...
_repository.Save(listing).Wait();
}
类返回任务:
protected override Task Save(...)
{
return Task.Run(() =>
{
... do some stuff ...
_logger.Debug("All Done!!!");
});
}
protected override async Task Save(...)
{
await Task.Run(() =>
{
... do some stuff ...
_logger.Debug("All Done!!!");
}).ConfigureAwait(false);
}
即使在修改后的版本中,我明确告诉等待的任务不要绑定到上下文,我仍然会遇到死锁
有什么想法吗?试试正常的异步等待模式
private async void Update(...)
{
//... do some stuff ...
await _repository.Save(listing);
}
protected override async Task Save(...)
{
... do some stuff ...
_logger.Debug("All Done!!!");
}
ConfigureAwait
只是在无法使用await
时的一种变通方法。最好的解决方案肯定是使Update
成为async Task
方法;有什么原因这不起作用吗?看起来,保存
需要等待,而lambda任务
需要异步。我的更新方法是WebApi IHttpController。让控制器返回异步void还是异步任务更好?感谢StephenNevermind的快速回复,我看你的博客提供了一个返回async Task的控制器方法示例。让我担心的是,实际上有其他代码使用同一存储库。Save方法,然后调用。等等,但其他代码不是死锁,也没有标记为async。我在我们的代码库中搜索了一下,发现到处都有数百个.Wait调用,但这是我们第一次看到死锁。我试图尽可能多地理解这个问题,以防我们在其他地方看到它。我知道这是一个很老的问题,但在更新中,异步无效使捕获异常变得很困难。如果可能,使用异步任务?