C#5.0の非同期で待ち受けて待つ

Task or Task<tresult> object is awaitable, so we can use await key on those whose return value is Task or Task<tresult>. Task or Task<tresult> are the most frequently-used awaitable object.

私たちはまた、私たち自身の待っているオブジェクトを定義することができます。オブジェクトは以下の資格を持つ必要があります。

  1. It has a GetAwaiter() method (instance method or extension method);
  2. Its GetAwaiter() method returns an awaiter. An object is an awaiter if:
    • It implements INotifyCompletion or ICriticalNotifyCompletion interface;
    • It has an IsCompleted, which has a getter and returns a Boolean;
    • it has a GetResult() method, which returns void, or a result.

私の質問は、Microsoftがこれらの待ち受けオブジェクトを制約するためのインターフェイスを提供しなかった理由です。 待望のオブジェクトを実装する現在の方法は少し複雑です。

10
nl ru de
GetAwaiterがITaskインターフェースメソッドではなく規約である理由を尋ねていますか? Microsoftはどこかでこの質問に答えました...私はどこで思い出すことができたらいいですか?
追加された 著者 Cory Nelson,

2 答え

It is best answered in Lucian Wischik's blog post Why must async methods return Task?

要約すると(私はブログ投稿の正義を実行していない、あなたはそれを読んでおくべきです)、問題は Task が既に存在しているということです。

  • すべての内部メソッドをインタフェースに変更する必要があり、フレームワークの人々が喜んで行うことはほとんど不可能です。
  • プログラマーは、 Task やインタフェースを返すかどうかを決める必要があります。
  • コンパイラには具体的な型が常に必要なので、メソッドからインタフェースを返しても、 Task としてコンパイルされます。

上記の影響は非常に大きいので、インターフェイスを提供することは意味がありません。

9
追加された
@ PanagiotisKanavosタスクはIAsyncOperationと同じですが、C#での非同期操作でもタスクが返されます。彼らはコンパイル時にメタデータを使用して違いを橋渡しします。私はそれを100%明確にしているわけではありませんが、それは私がそれを理解する方法なので、理論的にはそれはあなたが正しいことを意味し、あなたは間違っています。
追加された 著者 Robert MacLean,
@PanagiotisKanavos合意したように、WinRTにはTasksという概念がありません。これは.NETの機能です。コンパイラは、プロジェクションを使用して.NETのものをWinRTアイテムに変換します。 .NETはまた、GetAwaiterを実装するものを待つことができます(リンクを参照してください)
追加された 著者 Robert MacLean,
実際、非同期操作でIAsyncOperationオブジェクトが返されるWindows RTでは、非.NET言語に対応するために変更が加えられました。これで、タスクはIAsyncOperationオブジェクトをラップするために使用されます
追加された 著者 Panagiotis Kanavos,
WinRTにはタスクの概念はありません。実際、C#でも、GetAwaiterメソッドでオブジェクトを返す限り、タクを返さない操作で await を呼び出すことができます。 WinRTのタスクは、戻り値そのものを処理する必要がある場合はラッパーです
追加された 著者 Panagiotis Kanavos,
あなたは見つけた!驚くばかり。
追加された 著者 Cory Nelson,

これは、 foreach キーワード( C#言語仕様" foreach文 ")。

基本的には、ダックタイピングです。型が MoveNext メソッドと Current プロパティを実装している場合は、C#コンパイラがオブジェクトによって公開されたシーケンスを反復処理する方法を知るために必要なすべてです。

これは、コレクション初期化子(C#言語仕様 "コレクション初期化子"のセクション7.6.10を参照)にも適用されます。唯一の要件は、型が、 System.Collections .IEnumerable インターフェイスにあり、 Add メソッドがあります。

つまり、 待ってキーワード特定のインタフェース実装を必要とせず(インタフェースを使用する場合はインタフェースがこれらのメソッドを提供しますが)、コンパイラが認識できるメソッドのパターンに過ぎません。

4
追加された