ホームページ >バックエンド開発 >C++ >C# で `await` キーワードを使用した後のスレッドの実行はどうなりますか?

C# で `await` キーワードを使用した後のスレッドの実行はどうなりますか?

DDD
DDDオリジナル
2024-12-29 21:54:10933ブラウズ

What Happens to Thread Execution After an `await` Keyword in C#?

「await」キーワード後のスレッドの実行を理解する

次のコード サンプルを考えてみましょう。

private void MyMethod()
{
    Task task = MyAsyncMethod();
    task.Wait();
}

private async Task MyAsyncMethod()
{
    //Code before await
    await MyOtherAsyncMethod();
    //Code after await
}

この例では、await キーワードが指定されている場合、 MyAsyncMethod() で検出された場合、制御は MyMethod() に戻ります。ただし、task.Wait()によりスレッドはロックされません。代わりに、継続 (await に続くコード) は別のスレッドで実行されます。

await オペレーターは、継続の実行方法を決定する同期コンテキストを利用します。デフォルトでは、呼び出し元が UI スレッドで実行されている場合、継続も UI スレッドで実行されます。これにより、UI 操作とのシームレスな統合が可能になります。

ただし、呼び出し元がスレッド プール スレッドで実行されている場合、継続は別のスレッド プール スレッドで実行される可能性があります。これは、スレッド プールのスレッドが特定のタスク専用ではなく、複数の操作に同時に使用できるためです。

await オペレーターの動作は、ConfigureAwait メソッドを使用して変更できることに注意することが重要です。このメソッドを使用すると、継続を同じスレッドで実行するか、別のスレッドで実行するかを指定できます。

たとえば、継続を同じスレッドで実行せず、代わりにスレッド プール スレッドで実行する場合は、次のようにします。

await task.ConfigureAwait(false);

同期コンテキストがどのように機能するかを理解することで、非同期コードでのスレッドの実行を効果的に管理し、潜在的なロックの問題を防ぐことができます。

以上がC# で `await` キーワードを使用した後のスレッドの実行はどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。