我遇到了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任務不結合上下文,我還是得到了僵局。
任何想法可能會發生什麼?
'ConfigureAwait'只是當你*不能*使用'await'一種變通方法。最好的解決辦法是使'Update'成爲'異步任務'方法;有什麼理由不起作用嗎? –
看起來'Save'需要'await',你的lambda'Task'需要'async'。 – mrtig
我的更新方法是一個WebApi IHttpController。讓控制器返回異步無效或異步任務會更好嗎? 感謝您的快速回復Stephen – Michael