Task.Rait Task.Run返回的任务死锁

时间:2013-08-22 16:55:15

标签: c# .net asynchronous .net-4.5 async-await

我在4.5中遇到了一些异步代码的死锁问题。我读了Stephen Cleary's blog about preventing deadlocks that occur when the task captures the executing context然后在同一个上下文中,你通过等待任务来阻止。我试图实现解决方案,但我仍然遇到死锁,我不明白为什么。

原始代码

消费类:

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);
    }

即使在修改后的版本中,我明确告诉等待的任务不要绑定到上下文,我仍然会遇到死锁。

有什么想法可能会发生什么?

1 个答案:

答案 0 :(得分:2)

尝试正常的异步等待模式

private async void Update(...)
{
    //... do some stuff ... 
   await _repository.Save(listing);
}

protected override async Task Save(...)
{

        ... do some stuff ...
        _logger.Debug("All Done!!!");
}