4

asyncメソッド シグネチャでの使用、およびこれらのメソッドの式での使用に関するその他の制限はawaitありますか? これまでのところ、 でマークされたメソッドasyncは、次の戻り値の型の 1 つしか持てないことを認識しています (もっとあるのでしょうか?)。

  • void
  • Task
  • Task<TResult>
4

3 に答える 3

6

async修飾子は、戻り値の型がvoidTask、またはのメソッドでのみ許可されます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>

于 2013-11-05T20:49:04.737 に答える
3

メソッドの主な技術的制約をasync突き止めました。この追加のガイダンスを提供します。

  1. 少なくとも 1 つの操作を行わasyncないメソッドを宣言しても意味がありません。そのようなメソッドは通常の同期メソッドと同等だからです。await
  2. async voidメソッドの記述は避けるべきです。これらは、非同期イベント ハンドラーの記述をサポートすることのみを目的としています。
  3. メソッドを呼び出す場合は、それを行う必要があります (または、少なくともタスクのステータスにアクセスし、発生した場合はそれを取得します)。そうしないと、そのメソッド内の待機中の操作の 1 つがキャッチしない例外をスローすると、その例外はファイナライザー スレッド1 (不良) で再スローされます。asyncawaitIsFaultedException

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 のデフォルトの動作ではなくなりましたが、構成を変更することでクライアント マシンで引き続き有効にすることができます。

于 2013-11-05T20:49:06.840 に答える