さまざまなC#非同期CTPサンプルを見ると、を返す非同期関数とvoid
、非ジェネリックを返す非同期関数がありTask
ます。Task<MyType>
非同期操作が完了したときにaを返すことが呼び出し元にデータを返すのに役立つ理由はわかりますが、returnタイプの関数はTask
データを返しません。戻ってみませんvoid
か?
4 に答える
発信者がタスクを待つか、継続を追加したい場合。
実際、戻る唯一の理由は、イベントハンドラーを作成しているために戻ることができないvoid
場合です。Task
メソッドが戻りTask
、構成可能です。Task<T>
つまりawait
、メソッド内でそれらを実行できますasync
。
async
返されるメソッドvoid
は構成可能ではありませんが、他に 2 つの重要なプロパティがあります。
- これらはイベント ハンドラとして使用できます。
- これらは「最上位」の非同期操作を表します。
2 番目のポイントは、未処理の非同期操作の数を維持するコンテキストを扱う場合に重要です。
ASP.NET コンテキストは、そのようなコンテキストの 1 つです。Task
非同期メソッドから待機せずに非同期メソッドを使用するvoid
と、ASP.NET 要求が早く完了しすぎます。
もう 1 つのコンテキストは、AsyncContext
単体テスト用に書いたものです (ここから入手できます)。このAsyncContext.Run
メソッドは、未処理の操作数を追跡し、ゼロになると戻ります。
タイプTask<T>
は、タスク並列ライブラリ(TPL)の主力タイプであり、T
「将来タイプの結果を生成する予定の作業/ジョブ」の概念を表します。「将来完了するが結果を返さない作業」の概念は、非ジェネリックタスクタイプによって表されます。
タイプの結果がどのように生成されるかは正確T
には、特定のタスクの実装の詳細です。作業は、ローカルマシン上の別のプロセス、別のスレッドなどにファームアウトされる場合があります。TPLタスクは通常、現在のプロセスのスレッドプールからワーカースレッドにファームアウトされますが、その実装の詳細はTask<T>
タイプの基本ではありません。むしろ、aTask<T>
は、を生成する任意の高遅延操作を表すことができますT
。
上記のコメントに基づく:
このawait
式は、「この式を評価して、将来結果を生成する作業を表すオブジェクトを取得します。現在のメソッドの残りの部分を、そのタスクの継続に関連付けられたコールバックとしてサインアップします。そのタスクが生成されたら、コールバックします。サインアップしたら、すぐに発信者に制御を戻します。」これは、通常のメソッド呼び出しとは対照的です。つまり、「実行していることを覚えて、完全に終了するまでこのメソッドを実行し、中断したところから再開して、メソッドの結果を確認する」ことを意味します。
編集:2011年10月のMSDNMagazineのEricLippertの記事を引用する必要があります。これは、そもそもこのことを理解する上で非常に役立ちました。
より多くの情報とホワイトページのロードについては、ここを参照してください。
これがお役に立てば幸いです。