C# Task.Run返回的任务上的Task.Wait死锁

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

我在4.5中遇到了一些异步代码的死锁问题。然后我在同样的背景下读到了你等待任务而阻碍的内容。我试图实现这个解决方案,但我仍然遇到了僵局,我不知道为什么

原始代码

消费类:

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调用,但这是我们第一次看到死锁。我试图尽可能多地理解这个问题,以防我们在其他地方看到它。我知道这是一个很老的问题,但在更新中,异步无效使捕获异常变得很困难。如果可能,使用异步任务?