Task.Run返回的Task上的Task.Wait死锁

本文关键字:Task Wait 死锁 上的 Run 返回 | 更新日期: 2023-09-27 18:28:36

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

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

有什么想法吗?

Task.Run返回的Task上的Task.Wait死锁

尝试正常的异步等待模式

private async void Update(...)
{
    //... do some stuff ... 
   await _repository.Save(listing);
}
protected override async Task Save(...)
{
        ... do some stuff ...
        _logger.Debug("All Done!!!");
}