[解決済み] voidを返すことと、Taskを返すことの違いは何ですか?
質問
様々な C# 非同期 CTP サンプルを見ていると、いくつかの非同期関数が
void
を返す非同期関数もあれば、一般的でない
Task
. を返す理由はわかります。
Task<MyType>
を返すことは、非同期処理が完了したときに呼び出し元にデータを返すのに便利であることはわかりますが、私が見た関数の中で、戻り値の型が
Task
を返す関数は、決してデータを返しません。 なぜ
void
?
どのように解決するのですか?
SLaksとKillercamの回答は良いものです。私はもう少し文脈を追加しようと思いました。
最初の質問は、基本的にどのメソッドにマークが付けられるかについてです
async
.
としてマークされたメソッドは
async
を返すことができます。void
,Task
またはTask<T>
. これらの違いは何ですか?
A
Task<T>
を返す非同期メソッドは待ち受けることができ、タスクが完了するとTをプロファリングします。
A
Task
を返す非同期メソッドを待ち受けにすることができ、タスクが完了するとその続きが実行されるようにスケジューリングされます。
A
void
を返す非同期メソッドは待ち受けることができません; それは "fire and forget" なメソッドです。それは非同期で動作し、それがいつ完了したかを知る方法はありません。SLaksが言うように、普通は非同期のイベントハンドラを作るときだけそうする。イベントが発生し、ハンドラが実行されます。イベントハンドラが返すタスクは、イベントハンドラはタスクを返さないので、誰もquot;await"しようとしませんし、たとえそうだとしても、どんなコードがタスクを使って何かに使うでしょうか?イベントハンドラはタスクを返さないので、イベントハンドラによって返されたタスクをquait"する人はいません。
コメントでの 2 つ目の質問は、本質的に、何が
await
を編集することです。
どのようなメソッドが
await
にはどのようなメソッドがあるのでしょうか?void リターンのメソッドはawait
になるのでしょうか?
いいえ、void リターンのメソッドは待ち受けできません。コンパイラは
await M()
への呼び出しに変換します。
M().GetAwaiter()
を呼び出すことになります。
GetAwaiter
はインスタンスメソッドか拡張メソッドである可能性があります。待ち受ける値は、待ち受けを得ることができるものでなければなりません。明らかに、 void-returnメソッドは待ち受けを得ることができる値を生成しないのです。
Task
void-returnメソッドはawaitable値を生成することができます。私たちは、サードパーティが独自の
Task
-のようなオブジェクトを実装し、それを待ち受けることができるようになるでしょう。しかし
async
以外のものを返すメソッドを宣言することはできません。
void
,
Task
または
Task<T>
.
(UPDATE: 私の最後の文は、C#の将来のバージョンによって改竄されるかもしれません。非同期メソッドにタスク型以外の戻り値の型を許可する提案があります)。
(UPDATE:上記の機能はC# 7に取り込まれました)。
関連
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] 2つの日付の差(日数)を計算する?
-
[解決済み] SelectとSelectManyの違い
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み] async/await - タスクとvoidをいつ返すか?
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み] 関数を終了するには?
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] この呼び出しが待機されていないことを警告し、現在のメソッドの実行を継続します。