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);
}
待機可能なタスクにコンテキストにバインドしないように明示的に指示している変更されたバージョンでも、デッドロックが発生します。
何が起こっているのでしょうか?