async
メソッド シグネチャでの使用、およびこれらのメソッドの式での使用に関するその他の制限はawait
ありますか? これまでのところ、 でマークされたメソッドasync
は、次の戻り値の型の 1 つしか持てないことを認識しています (もっとあるのでしょうか?)。
void
Task
Task<TResult>
async
メソッド シグネチャでの使用、およびこれらのメソッドの式での使用に関するその他の制限はawait
ありますか? これまでのところ、 でマークされたメソッドasync
は、次の戻り値の型の 1 つしか持てないことを認識しています (もっとあるのでしょうか?)。
void
Task
Task<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
します。Task
Task<T>
IAsyncOperation
IAsyncOperation<T>
メソッドの主な技術的制約をasync
突き止めました。この追加のガイダンスを提供します。
async
ないメソッドを宣言しても意味がありません。そのようなメソッドは通常の同期メソッドと同等だからです。await
async void
メソッドの記述は避けるべきです。これらは、非同期イベント ハンドラーの記述をサポートすることのみを目的としています。async
await
IsFaulted
Exception
await
待機可能な型、つまりメンバーを宣言する型を持つ任意のオブジェクトを作成できます。
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 のデフォルトの動作ではなくなりましたが、構成を変更することでクライアント マシンで引き続き有効にすることができます。