非同期呼び出しが必ずしも別のスレッドで実行されるとは限らない場合、非同期呼び出しをブロックするとデッドロックが発生する可能性がありますか?

avhhh

最近、同期メソッドで非同期コードを呼び出すときに発生する可能性のあるデッドロックに関するStephen Clearyの投稿を読みました:https//blog.stephencleary.com/2012/07/dont-block-on-async-code.html

ここで少し変更された例について(私が追加したのは書き込みコードだけでした):

// My "library" method.
public static async Task<JObject> GetJsonAsync(Uri uri)
{
  Console.WriteLine("Before await");
  using (var client = new HttpClient())
  {
    var jsonString = await client.GetStringAsync(uri).ConfigureAwait(true);
    return JObject.Parse(jsonString);
  }
}

// My "top-level" method.
public void Button1_Click(...)
{
  var jsonTask = GetJsonAsync(...);
  textBox1.Text = jsonTask.Result;
}

彼の説明によると、トップレベルのメソッドはUIスレッドが終了するのを待っているのGetJsonAsyncに対しGetJsonAsync、UIスレッドが解放されて実行が終了するのを待っています。

私の質問は、GetJsonAsyncまだUIスレッドにないのですか?なぜそれが解放されるのを待つ必要があるのでしょうか?この投稿によると、ここで非同期関数を呼び出すと、メソッドを実行するための別のスレッドが作成されるとは限りません。ではGetJsonAsync、UIスレッドでずっと実行されていた場合、UIスレッドでどのように問題が発生するのでしょうか。Console.WriteLine()UIスレッドではない場合、いつ実行されるかなど、これはどこで実行されますか?ここで何かが足りないような気がしますが、何がわからないのです。

明確化:実行はどの時点でUIスレッド/コンテキストを離れ、戻る必要がありますか?戻る必要があることについては非常に多くの議論がありますが、スレッド/コンテキストを離れるときは決してありません。

スティーブン・クリアリー

私が求めているのは、この呼び出しが実行するための新しいスレッドを作成しない場合、Button1_Clickから呼び出されたときにGetJsonAsyncがどこで実行されるかです。GetJsonAsync内で待機する前に、UIコンテキスト内でConsole.WriteLine(...)を実行していませんか?

asyncイントロを読むことをお勧めします。要約すれば:

すべての非同期メソッドは同期的に実行を開始します。このコード:

public void Button1_Click(...)
{
  var jsonTask = GetJsonAsync(...);
  textBox1.Text = jsonTask.Result;
}

GetJsonAsyncUIスレッドを呼び出し、UIスレッドで実行を開始します。Console.WriteLineUIスレッドで実行され、UIスレッドでnewクライアントを起動し、UIスレッドで呼び出しさえしGetStringAsyncます。そのメソッドからタスクを取得し、それを実行しますawaitConfigureAwait(true)簡単にするために無視しています)。

これawaitは、物事が非同期になる可能性があるポイントです。タスクは完了していない(つまり、クライアントはまだ文字列を受信して​​いない)ため、不完全なタスクを呼び出し元にGetJsonAsync 返します次にButton1_Click、UIスレッドをブロックし、そのタスクが完了するのを待ちます(を呼び出すことにより.Result)。

そのため、現在、状態はGetJsonAsyncUIスレッドで実行されていません。実際にはどこでも「実行」されていません

その後、その文字列の結果が到着すると、から返されたタスクGetStringAsyncが完了し、GetJsonAsync実行を再開する必要があります。まだUIスレッドにはありません。現時点ではどこにもありません。awaitキャプチャされたUIコンテキスト以降、(UIスレッドで)そのコンテキストで再開を試みます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ