2013-08-22 51 views
1

我遇到了4.5中的一些異步代碼的死鎖問題。我讀Stephen Cleary's blog about preventing deadlocks that occur when the task captures the executing context然後在同樣的情況下,你等待任務阻止。我試圖實施解決方案,但我仍然陷入僵局,我不明白爲什麼。Task.Wait由Task.Run返回的任務上的死鎖

原始代碼

消費類:

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

類,返回任務:

protected override Task Save(...) 
    { 
     return Task.Run(() => 
     { 
      ... do some stuff ... 
      _logger.Debug("All Done!!!"); 
     }); 
    } 

改進型Code

Consu明類別:

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任務不結合上下文,我還是得到了僵局。

任何想法可能會發生什麼?

+2

'ConfigureAwait'只是當你*不能*使用'await'一種變通方法。最好的解決辦法是使'Update'成爲'異步任務'方法;有什麼理由不起作用嗎? –

+0

看起來'Save'需要'await',你的lambda'Task'需要'async'。 – mrtig

+0

我的更新方法是一個WebApi IHttpController。讓控制器返回異步無效或異步任務會更好嗎? 感謝您的快速回復Stephen – Michael

回答

2

嘗試正常的異步模式等待

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

protected override async Task Save(...) 
{ 

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

我已添加缺少的異步請刪除您的投票。 – 2013-08-23 11:22:41

+0

這是v我知道,但在更新異步無效很難捕獲異常很好,如果可能使用異步任務? –