async
c# の/キーワードを使用した非同期プログラミングのベスト プラクティスをいくつか見つけましたawait
(c# 5.0 は初めてです)。
与えられたアドバイスの1つは次のとおりです。
安定性: 同期コンテキストを把握する
... 一部の同期コンテキストは、再入不可でシングルスレッドです。これは、特定の時点でコンテキスト内で実行できる作業単位は 1 つだけであることを意味します。この例は、Windows UI スレッドまたは ASP.NET 要求コンテキストです。これらのシングル スレッド同期コンテキストでは、簡単にデッドロック状態になります。シングルスレッド コンテキストからタスクを生成し、コンテキストでそのタスクを待機すると、待機中のコードがバックグラウンド タスクをブロックしている可能性があります。
public ActionResult ActionAsync()
{
// DEADLOCK: this blocks on the async task
var data = GetDataAsync().Result;
return View(data);
}
private async Task<string> GetDataAsync()
{
// a very simple async method
var result = await MyWebService.GetDataAsync();
return result.ToString();
}
私が自分で分析しようとすると、メイン スレッドは で新しいものに生成されますMyWebService.GetDataAsync();
が、メイン スレッドはそこで待機するため、 で結果を待ちますGetDataAsync().Result
。その間、データの準備ができたとします。メインスレッドが継続ロジックを継続せず、文字列の結果を返すのはなぜGetDataAsync()
ですか?
上記の例でデッドロックが発生する理由を誰か説明してもらえますか? 私は問題が何であるかについて完全に無知です...