1

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

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

任何想法可能会发生什么?

4

1 回答 1

2

尝试正常的异步等待模式

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

protected override async Task Save(...)
{

        ... do some stuff ...
        _logger.Debug("All Done!!!");
}
于 2013-08-22T18:05:40.667 回答