await (C# リファレンス)
await の演算子は、非同期メソッドのタスクに必要なタスクが完了するまでメソッドの実行を中断する適用されます。タスクは、進行中の作業を表します。
await を使用する非同期メソッドは [async] キーワードで変更する必要があります。async 修飾子を使用し、通常は await の一つ以上の式を含むことで定義されます。これらのメソッドを 非同期のメソッドと呼ばれます。
[!メモ]
async と await のキーワードは、Visual Studio 2012 で導入されました。そのバージョンの新しい機能については、Visual Studio 2012 の新機能を参照してください。
プログラムする非同期の概要については Async および Await を使用した非同期プログラミング (C# および Visual Basic)を参照してください。
await の演算子は、通常、適用されたタスクは呼び出しから実行する タスク ベースの非同期パターンメソッドに戻り値です。この例では、型 Task か Task<TResult>の値が含まれます。
次のコードでは、HttpClient のメソッド GetByteArrayAsync は Task<byte[]>、getContentsTaskを返します。タスクはタスクが完了したときに実際のバイト配列を生成する約束です。getContentsTask が完了するまで getContentsTask に await 演算子が SumPageSizesAsync の実行を中断するために適用されます。一方、コントロールは SumPageSizesAsyncの呼び出し元に返します。getContentsTask が終了すると、await の式はバイト配列に評価されます。
private async Task SumPageSizesAsync()
{
// To use the HttpClient type in desktop apps, you must include a using directive and add a
// reference for the System.Net.Http namespace.
HttpClient client = new HttpClient();
// . . .
Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
byte[] urlContents = await getContentsTask;
// Equivalently, now that you see how it works, you can write the same thing in a single line.
//byte[] urlContents = await client.GetByteArrayAsync(url);
// . . .
}
重要 |
---|
コード例全体については、「チュートリアル: Async と Await を使用した Web へのアクセス (C# および Visual Basic)」を参照してください。Microsoft Web サイトから 開発者コード サンプル サンプルをダウンロードできます。この例では AsyncWalkthrough_HttpClient のプロジェクトにあります。 |
前の例に示すように await が Task<TResult>を返すメソッドの呼び出しの結果に適用されている場合、await の式の型が TResult です。await が Taskを返すメソッドの呼び出しの結果に適用されている場合、await の式の型が無効です。次の例では、相違点を示します。
// Keyword await used with a method that returns a Task<TResult>.
TResult result = await AsyncMethodThatReturnsTaskTResult();
// Keyword await used with a method that returns a Task.
await AsyncMethodThatReturnsTask();
await の式が実行しているスレッドをブロックします。代わりに、新しい登録にコンパイラに非同期のメソッドの残りの部分を、必要なタスクの継続されます。コントロールは、非同期のメソッド呼び出し元に制御が戻ります。タスクを完了すると、継続を開始し、場所からプロセスまたは async のメソッドの実行が再開されます。
await の式は async 修飾子で示された、外側のメソッド、ラムダ式、または匿名メソッドの本体でのみ実行できます。用語は、コンテキスト キーワードのみの役割を待機します。他の場所では、識別子として解釈されます。メソッドは、ラムダ式、または匿名メソッド内で、await の式は同期の関数の本体で、クエリ式で、例外処理ステートメントの catch または finally ブロックで、ロック ステートメントブロック、または リスク のコンテキストで実行できません。
例外
ほとんどの非同期のメソッドは Task か Task<TResult>を返します。返されたタスクのプロパティは、非同期のメソッドによって例外が発生したり、キャンセルまたはどうか、最終的にに何かどうかタスクが完了した状態と履歴に関する情報を伝え、など)。await の演算子は、これらのプロパティにアクセスします。
例外を発生させるタスクを返す非同期のメソッドを待機 await、演算子での例外。
[キャンセル]返される非同期タスクのメソッドを待機 await では、演算子の OperationCanceledException。
違反状態にある単一のタスクが複数の例外を反映できます。たとえば、タスクは Task.WhenAllへの呼び出し結果になることがあります。このようなタスクで待機すると、例外の要求の操作で 1 だけ。ただし、されるであるかは例外のどの予測できません。
非同期のメソッドのエラー処理の例については、try-catch (C# リファレンス)を参照してください。
使用例
次の Windows フォームには、非同期のメソッドの await、WaitAsynchronouslyAsyncの使用例です。WaitSynchronouslyの動作を持つそのメソッドの動作の違いを確認します。タスクに適用される await 演算子なしの WaitSynchronously は本体の Thread.Sleep に定義と呼び出しの async 修飾子の使用に関係なく同期的に実行されます。
private async void button1_Click(object sender, EventArgs e)
{
// Call the method that runs asynchronously.
string result = await WaitAsynchronouslyAsync();
// Call the method that runs synchronously.
//string result = await WaitSynchronously ();
// Display the result.
textBox1.Text += result;
}
// The following method runs asynchronously. The UI thread is not
// blocked during the delay. You can move or resize the Form1 window
// while Task.Delay is running.
public async Task<string> WaitAsynchronouslyAsync()
{
await Task.Delay(10000);
return "Finished";
}
// The following method runs synchronously, despite the use of async.
// You cannot move or resize the Form1 window while Thread.Sleep
// is running because the UI thread is blocked.
public async Task<string> WaitSynchronously()
{
// Add a using directive for System.Threading.
Thread.Sleep(10000);
return "Finished";
}
参照
処理手順
チュートリアル: Async と Await を使用した Web へのアクセス (C# および Visual Basic)