137

さまざまなC#非同期CTPサンプルを見ると、を返す非同期関数とvoid、非ジェネリックを返す非同期関数がありTaskます。Task<MyType>非同期操作が完了したときにaを返すことが呼び出し元にデータを返すのに役立つ理由はわかりますが、returnタイプの関数はTaskデータを返しません。戻ってみませんvoidか?

4

4 に答える 4

24

発信者がタスクを待つか、継続を追加したい場合。

実際、戻る唯一の理由は、イベントハンドラーを作成しているために戻ることができないvoid場合です。Task

于 2011-11-07T22:09:42.427 に答える
19

メソッドが戻りTask、構成可能です。Task<T>つまりawait、メソッド内でそれらを実行できますasync

async返されるメソッドvoidは構成可能ではありませんが、他に 2 つの重要なプロパティがあります。

  1. これらはイベント ハンドラとして使用できます。
  2. これらは「最上位」の非同期操作を表します。

2 番目のポイントは、未処理の非同期操作のを維持するコンテキストを扱う場合に重要です。

ASP.NET コンテキストは、そのようなコンテキストの 1 つです。Task非同期メソッドから待機せずに非同期メソッドを使用するvoidと、ASP.NET 要求が早く完了しすぎます。

もう 1 つのコンテキストは、AsyncContext単体テスト用に書いたものです (ここから入手できます)。このAsyncContext.Runメソッドは、未処理の操作数を追跡し、ゼロになると戻ります。

于 2011-11-09T01:46:07.680 に答える
12

タイプTask<T>は、タスク並列ライブラリ(TPL)の主力タイプであり、T「将来タイプの結果を生成する予定の作業/ジョブ」の概念を表します。「将来完了するが結果を返さない作業」の概念は、非ジェネリックタスクタイプによって表されます。

タイプの結果がどのように生成されるかは正確Tには、特定のタスクの実装の詳細です。作業は、ローカルマシン上の別のプロセス、別のスレッドなどにファームアウトされる場合があります。TPLタスクは通常、現在のプロセスのスレッドプールからワーカースレッドにファームアウトされますが、その実装の詳細はTask<T>タイプの基本ではありません。むしろ、aTask<T>は、を生成する任意の高遅延操作を表すことができますT

上記のコメントに基づく:

このawait式は、「この式を評価して、将来結果を生成する作業を表すオブジェクトを取得します。現在のメソッドの残りの部分を、そのタスクの継続に関連付けられたコールバックとしてサインアップします。そのタスクが生成されたら、コールバックします。サインアップしたら、すぐに発信者に制御を戻します。」これは、通常のメソッド呼び出しとは対照的です。つまり、「実行していることを覚えて、完全に終了するまでこのメソッドを実行し、中断したところから再開して、メソッドの結果を確認する」ことを意味します。


編集:2011年10月のMSDNMagazineのEricLippertの記事を引用する必要があります。これは、そもそもこのことを理解する上で非常に役立ちました。

より多くの情報とホワイトページのロードについては、ここを参照してください。

これがお役に立てば幸いです。

于 2011-11-07T22:33:42.640 に答える