ホームページ > バックエンド開発 > C++ > 非同期/待機: バックグラウンド スレッドのためにメソッドを「Task.Run」でラップする必要がありますか?

非同期/待機: バックグラウンド スレッドのためにメソッドを「Task.Run」でラップする必要がありますか?

Patricia Arquette
リリース: 2025-01-05 12:31:40
オリジナル
190 人が閲覧しました

Async/Await: Should I Wrap My Method in `Task.Run` for Background Threading?

Async/Await の解明: メソッド ラッパーかバックグラウンド スレッドか?

async/await を理解しようとすると、ジレンマが生じます: メソッドを内部にカプセル化する必要があるかどうかTask.Run を使用して、非同期動作とバックグラウンド スレッド実行の両方を実現しますか?

非同期メソッドと待機可能なタスク

「非同期」は、実行を開始する前に呼び出しスレッドに制御を渡すことができるメソッドを示します。この譲歩は await 式を通じて発生します。対照的に、MSDN で定義されている「非同期」 (誤解を招きやすい用語) は、別のスレッドで実行されるコードを指します。

これとは別に、「awaitable」は、await 演算子で使用できる型を表します。一般的な待機可能オブジェクトには、Task と Task が含まれます。

バックグラウンド スレッド実行用のコードの調整

待機可能性を維持しながらバックグラウンド スレッドでメソッドを実行するには、Task.Run:

private Task<int> DoWorkAsync()
{
  return Task.Run(() => 1 + 2);
}
ログイン後にコピー
ただし、このアプローチは一般的に推奨されません。

有効化非同期譲歩

一時停止して制御を譲ることができる非同期メソッドを作成するには、メソッドを async として宣言し、指定された譲歩ポイントで await を使用します。

private async Task<int> GetWebPageHtmlSizeAsync()
{
  var html = await client.GetAsync("http://www.example.com/");
  return html.Length;
}
ログイン後にコピー
非同期コードと Awaitable のリンク

非同期コードは、await 式内の awaitables に依存します。 Awaitables は、他の非同期メソッドか、awaitables を返す同期メソッドのいずれかです。

Task.Run でのメソッドのラップ: 推奨されない実践

Task.Run 内で同期メソッドを無差別にラップすることは避けてください。代わりに、コンシューマにラップのオプションを残して、同期署名を維持します。

Async/Await の追加リソース

    [Async/Await]基本](https://blog.stephencleary.com/2012/02/async-await-fundamentals.html)
  • [MSDN 非同期ドキュメント](https://docs.microsoft.com/en-us) /dotnet/csharp/programming-guide/concepts/async/)

以上が非同期/待機: バックグラウンド スレッドのためにメソッドを「Task.Run」でラップする必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート