ホームページ > バックエンド開発 > C++ > 「Task.Result」と「await Task」: いつどちらを使用する必要がありますか?

「Task.Result」と「await Task」: いつどちらを使用する必要がありますか?

Susan Sarandon
リリース: 2025-01-08 09:02:41
オリジナル
421 人が閲覧しました

`Task.Result` vs. `await Task`: When Should You Use Which?

非同期プログラミングにおける Task<T>.Resultawait Task<T> を理解する

非同期プログラミングでは、await Task<T>Task<T>.Result のどちらを選択するかがパフォーマンスと例外処理に大きく影響します。 主な違いを見てみましょう。

GetName メソッドは両方のアプローチを示しています。

Task<T>.Result の使用:

<code class="language-csharp">public async Task<string> GetName(int id)
{
    Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id));
    return nameTask.Result;
}</code>
ログイン後にコピー

nameTask.Result は、タスクが完了するまで現在のスレッドをブロックします。これは長時間実行される操作では非効率的であり、アプリケーションのフリーズを引き起こす可能性があります。

await Task<T> の使用:

<code class="language-csharp">public async Task<string> GetName(int id)
{
    Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id));
    return await nameTask;
}</code>
ログイン後にコピー

await nameTask は呼び出しスレッドを解放し、他のタスクが同時に実行できるようにします。 このメソッドは、nameTask が終了した場合にのみ再開されます。

重要な相違点:

  • スレッドのブロック: Task<T>.Result ブロック。 await Task<T> はそうではありません。
  • 例外処理: await Task<T> は例外を直接伝播します。 Task<T>.Result はそれらを AggregateException で包みます。

ベストプラクティス:

  • バックグラウンド タスクには Task.Factory.StartNew を使用しないでください。効率を向上させ、.NET スレッド プールとの統合を改善するには、代わりに Task.Run を使用してください。
  • Task<T>.ResultTask.Factory.StartNew は動的タスクの並列処理に使用できますが、非同期プログラミング コンテキストでは一般に、応答性と保守性を向上させるために await を使用することは推奨されません。 await の使用は、非同期操作のより堅牢なアプローチとして推奨されます。

以上が「Task.Result」と「await Task」: いつどちらを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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