asyncメソッド シグネチャでの使用、およびこれらのメソッドの式での使用に関するその他の制限はawaitありますか? これまでのところ、 でマークされたメソッドasyncは、次の戻り値の型の 1 つしか持てないことを認識しています (もっとあるのでしょうか?)。
voidTaskTask<TResult>
asyncメソッド シグネチャでの使用、およびこれらのメソッドの式での使用に関するその他の制限はawaitありますか? これまでのところ、 でマークされたメソッドasyncは、次の戻り値の型の 1 つしか持てないことを認識しています (もっとあるのでしょうか?)。
voidTaskTask<TResult>async修飾子は、戻り値の型がvoid、Task、またはのメソッドでのみ許可されますTask<T>。一般に、演算子を含むメソッドでのみ使用する必要があります。await
演算子は、任意の型tawaitで使用できます(C# 言語仕様、7.7.7 より):
t には、パラメーターも型パラメーターもない GetAwaiter というアクセス可能なインスタンスまたは拡張メソッドと、次のすべてが保持される戻り値の型 A があります。
- A はインターフェイス System.Runtime.CompilerServices.INotifyCompletion を実装します
- A には、bool 型のアクセス可能で読み取り可能なインスタンス プロパティ IsCompleted があります。
- A には、パラメーターも型パラメーターもないアクセス可能なインスタンス メソッド GetResult があります。
実際には、これは通常、(Windows Store API からの) 、 、 、およびフレームワーク内の他のいくつかの選択型で使用できることを意味awaitします。TaskTask<T>IAsyncOperationIAsyncOperation<T>
メソッドの主な技術的制約をasync突き止めました。この追加のガイダンスを提供します。
asyncないメソッドを宣言しても意味がありません。そのようなメソッドは通常の同期メソッドと同等だからです。awaitasync voidメソッドの記述は避けるべきです。これらは、非同期イベント ハンドラーの記述をサポートすることのみを目的としています。asyncawaitIsFaultedExceptionawait待機可能な型、つまりメンバーを宣言する型を持つ任意のオブジェクトを作成できます。
TAwaiter GetAwaiter();
TAwaiter次のメンバーを宣言する型です。
bool IsCompleted { get; }
TResult GetResult();
void OnCompleted(Action continuation); // inherited from INotifyCompletion
IsCompletedプロパティは自己記述的です。待機可能な操作がすでに完了している場合は戻りますtrue。それ以外の場合は false を返します。
このGetResult()メソッドは操作の結果を返すvoidか、操作に戻り値の型がない場合は戻ります。が呼び出された場合はスローする必要IsCompletedがありfalseます。
このOnCompleted()メソッドは、継続、つまり操作の完了時に呼び出されるコードを登録するために使用されます。このメンバーは実際には名前空間から継承する必要がINotifyCompletionありSystem.Runtime.CompilerServicesます (すべての awaiter はこのインターフェイスを実装する必要があります)。
1これは .NET 4.5 のデフォルトの動作ではなくなりましたが、構成を変更することでクライアント マシンで引き続き有効にすることができます。