Async および Await を使用した非同期プログラミング (C#)Asynchronous programming with async and await (C#)

パフォーマンスのボトルネックを回避しアプリケーション全体の応答性を向上させるために、非同期プログラミングを使用できます。You can avoid performance bottlenecks and enhance the overall responsiveness of your application by using asynchronous programming. ただ、非同期アプリケーションを作成する従来の方法は複雑で、プログラムの作成、デバッグ、保守が困難な場合があります。However, traditional techniques for writing asynchronous applications can be complicated, making them difficult to write, debug, and maintain.

C# 5 では、.NET Framework 4.5 以降、.NET Core および Windows ランタイムの非同期サポートを利用した "非同期プログラミング" と呼ばれる簡単な方法が導入されました。C# 5 introduced a simplified approach, async programming, that leverages asynchronous support in the .NET Framework 4.5 and higher, .NET Core, and the Windows Runtime. コンパイラがこれまで開発者が行っていた難しい作業を実行し、アプリケーションは同期コードに類似した論理構造を保持します。The compiler does the difficult work that the developer used to do, and your application retains a logical structure that resembles synchronous code. その結果、わずかな作業量で非同期プログラミングのすべての利点を得られます。As a result, you get all the advantages of asynchronous programming with a fraction of the effort.

このトピックでは、非同期プログラミングをいつ、どのように使用するかの概要を紹介します。詳細と例を含むをサポート トピックへのリンクもあります。This topic provides an overview of when and how to use async programming and includes links to support topics that contain details and examples.

非同期による応答性の改善Async improves responsiveness

Web アクセスなど、ブロックされる可能性がある操作には、非同期が必要となります。Asynchrony is essential for activities that are potentially blocking, such as web access. Web リソースへのアクセスには、遅延が発生することがあります。Access to a web resource sometimes is slow or delayed. このような操作が同期処理内でブロックされた場合、アプリケーション全体が待機する必要があります。If such an activity is blocked in a synchronous process, the entire application must wait. 非同期処理では、ブロックする可能性のあるタスク終了するまで、アプリケーションは Web リソースに依存しない他の操作を続行できます。In an asynchronous process, the application can continue with other work that doesn't depend on the web resource until the potentially blocking task finishes.

非同期プログラミングによって応答性を向上する一般的な領域を、次の表に示します。The following table shows typical areas where asynchronous programming improves responsiveness. .NET および Windows ランタイムの API の一覧には、非同期のプログラミングをサポートするメソッドが含まれます。The listed APIs from .NET and the Windows Runtime contain methods that support async programming.

アプリケーション領域Application area 非同期メソッドがある .NET 型.NET types with async methods 非同期メソッドがある Windows ランタイム型Windows Runtime types with async methods
Web アクセスWeb access HttpClient SyndicationClientSyndicationClient
ファイルの処理Working with files StreamWriterStreamReaderXmlReaderStreamWriter, StreamReader, XmlReader StorageFileStorageFile
イメージの処理Working with images MediaCaptureBitmapEncoderBitmapDecoderMediaCapture, BitmapEncoder, BitmapDecoder
WCF プログラミングWCF programming 同期操作と非同期操作Synchronous and Asynchronous Operations

非同期性は、UI スレッドにアクセスするアプリケーションに対して特に有効です。これは、すべての UI 関連のアクティビティが一般的に 1 つのスレッドを共有するためです。Asynchrony proves especially valuable for applications that access the UI thread because all UI-related activity usually shares one thread. 同期アプリケーションでは、1 つのプロセスがブロックされるとすべてがブロックされます。If any process is blocked in a synchronous application, all are blocked. アプリケーションが応答を停止するため、待機状態であるとは考えずに失敗したと結論付けることもあります。Your application stops responding, and you might conclude that it has failed when instead it's just waiting.

非同期メソッドを使用すると、アプリケーションは UI に応答し続けます。When you use asynchronous methods, the application continues to respond to the UI. たとえば、ウィンドウのサイズ変更や最小化を実行したり、アプリケーション処理の完了待たずに、アプリケーションを閉じたりできます。You can resize or minimize a window, for example, or you can close the application if you don't want to wait for it to finish.

非同期ベースの方法は、非同期操作を設計する場合に選択できるオプションの一覧に、自動送信に相当するものを追加します。The async-based approach adds the equivalent of an automatic transmission to the list of options that you can choose from when designing asynchronous operations. つまり、開発者の少しの作業量で、従来の非同期プログラミングのすべての利点を取得できます。That is, you get all the benefits of traditional asynchronous programming but with much less effort from the developer.

非同期メソッドの作成の簡素化Async methods are easier to write

C# の async キーワードと await キーワードは、非同期プログラミングの中核です。The async and await keywords in C# are the heart of async programming. これら 2 つのキーワードを使用すると、同期メソッドの作成とほぼ同様の容易さで、.NET Framework、.NET Core または Windows ランタイムのリソースを使用して非同期メソッドを作成できます。By using those two keywords, you can use resources in the .NET Framework, .NET Core, or the Windows Runtime to create an asynchronous method almost as easily as you create a synchronous method. async および await を使用して定義する非同期メソッドは、async メソッドと呼ばれます。Asynchronous methods that you define by using async and await are referred to as async methods.

async メソッドの例を次に示します。The following example shows an async method. コードのほとんどは、見たことのあるものと思います。Almost everything in the code should look completely familiar to you. コメントは、非同期性を作成するために追加した機能を明示しています。The comments call out the features that you add to create the asynchrony.

このトピックの最後に完全な Windows Presentation Foundation (WPF) サンプル ファイルがあります。また、「Async Sample: Example from "Asynchronous Programming with Async and Await" (非同期のサンプル: 「Async および Await を使用した非同期プログラミング」の例)」からサンプルをダウンロードできます。You can find a complete Windows Presentation Foundation (WPF) example file at the end of this topic, and you can download the sample from Async Sample: Example from "Asynchronous Programming with Async and Await".

// Three things to note in the signature:  
//  - The method has an async modifier.   
//  - The return type is Task or Task<T>. (See "Return Types" section.)  
//    Here, it is Task<int> because the return statement returns an integer.  
//  - The method name ends in "Async."  
async Task<int> AccessTheWebAsync()  
{   
    // You need to add a reference to System.Net.Http to declare client.  
    HttpClient client = new HttpClient();  

    // GetStringAsync returns a Task<string>. That means that when you await the  
    // task you'll get a string (urlContents).  
    Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");  

    // You can do work here that doesn't rely on the string from GetStringAsync.  
    DoIndependentWork();  

    // The await operator suspends AccessTheWebAsync.  
    //  - AccessTheWebAsync can't continue until getStringTask is complete.  
    //  - Meanwhile, control returns to the caller of AccessTheWebAsync.  
    //  - Control resumes here when getStringTask is complete.   
    //  - The await operator then retrieves the string result from getStringTask.  
    string urlContents = await getStringTask;  

    // The return statement specifies an integer result.  
    // Any methods that are awaiting AccessTheWebAsync retrieve the length value.  
    return urlContents.Length;  
}  

AccessTheWebAsyncGetStringAsync を呼び出してその完了を待機する間で実行できる作業がない場合、次の 1 つのステートメントで呼び出しと待機をするようにコードを簡略化できます。If AccessTheWebAsync doesn't have any work that it can do between calling GetStringAsync and awaiting its completion, you can simplify your code by calling and awaiting in the following single statement.

string urlContents = await client.GetStringAsync();  

次の特徴は、前の例を非同期のメソッドにするための概略です。The following characteristics summarize what makes the previous example an async method.

  • メソッド シグネチャは async 修飾子を含みます。The method signature includes an async modifier.

  • 非同期メソッドの名前は、慣例により「Async」というサフィックスで終わります。The name of an async method, by convention, ends with an "Async" suffix.

  • 戻り値の型は次のいずれかになります:The return type is one of the following types:

    • メソッドが、オペランドに TResult 型を持つステートメントを戻す場合、Task<TResult>Task<TResult> if your method has a return statement in which the operand has type TResult.

    • メソッドがステートメントを戻さない、またはオペランドを持たないステートメントを戻す場合、TaskTask if your method has no return statement or has a return statement with no operand.

    • 非同期のイベント ハンドラーを作成する場合、VoidVoid if you're writing an async event handler.

    • GetAwaiter メソッドがあるその他の任意の型 (C# 7 以降)。Any other type that has a GetAwaiter method (starting with C# 7).

    詳細については、このトピックで後述する「戻り値の型およびパラメーター」を参照してください。For more information, see "Return Types and Parameters" later in this topic.

  • メソッドには、通常は 1 つ以上の await 式があり、待機中の非同期操作が完了するまでメソッドを続行できないポイントをマークします。The method usually includes at least one await expression, which marks a point where the method can't continue until the awaited asynchronous operation is complete. この間メソッドは中断し、メソッドの呼び出し元にコントロールを戻します。In the meantime, the method is suspended, and control returns to the method's caller. このトピックの次のセクションでは、中断ポイントで何が発生するかを説明します。The next section of this topic illustrates what happens at the suspension point.

非同期のメソッドでは、指定のキーワードと型を使用して何を実行するかを示すと、コンパイラがその作業を引き継ぎます。作業には、中断されたメソッドの待機ポイントにコントロールが戻された場合に実行される作業を、継続的に追跡することも含まれます。In async methods, you use the provided keywords and types to indicate what you want to do, and the compiler does the rest, including keeping track of what must happen when control returns to an await point in a suspended method. ループおよび例外処理など一部のルーチンのプロセスは、従来の非同期コードによる操作が困難な場合があります。Some routine processes, such as loops and exception handling, can be difficult to handle in traditional asynchronous code. 非同期のメソッドでは、同期ソリューションの場合と同様にこれらの要素を記述すると、問題が解決します。In an async method, you write these elements much as you would in a synchronous solution, and the problem is solved.

.NET Framework の以前のバージョンでの非同期性の詳細については、「TPL と従来の .NET Framework 非同期プログラミング」を参照してください。For more information about asynchrony in previous versions of the .NET Framework, see TPL and Traditional .NET Framework Asynchronous Programming.

非同期メソッドでの動作What happens in an async method

非同期プログラミングでは理解が必要な最も重要なことは、コントロール フローがどのようにメソッドからのメソッドに移動するかということです。The most important thing to understand in asynchronous programming is how the control flow moves from method to method. 次の図は、このプロセスについて説明します。The following diagram leads you through the process.

非同期プログラムのトレースTrace an async program

図内の数字は、次の手順の番号に対応しています。The numbers in the diagram correspond to the following steps.

  1. イベント ハンドラーは AccessTheWebAsync 非同期のメソッドを呼び出して待機します。An event handler calls and awaits the AccessTheWebAsync async method.

  2. AccessTheWebAsyncHttpClient インスタンスを作成し、文字列として Web サイトのコンテンツをダウンロードする GetStringAsync 非同期メソッドを呼び出します。AccessTheWebAsync creates an HttpClient instance and calls the GetStringAsync asynchronous method to download the contents of a website as a string.

  3. GetStringAsync に何かが発生するとプロセスが中断します。Something happens in GetStringAsync that suspends its progress. Web サイトからのダウンロード処理、または他のブロックしているアクティビティを待機する必要が考えられます。Perhaps it must wait for a website to download or some other blocking activity. リソースのブロックを回避するために、GetStringAsync は呼び出し元の AccessTheWebAsync にコントロールを戻します。To avoid blocking resources, GetStringAsync yields control to its caller, AccessTheWebAsync.

    GetStringAsyncTResult が文字列である Task<TResult> を返し、AccessTheWebAsyncgetStringTask 変数にタスクを割り当てます。GetStringAsync returns a Task<TResult> where TResult is a string, and AccessTheWebAsync assigns the task to the getStringTask variable. タスクには GetStringAsync への呼び出しの進行中のプロセスを表し、作業が完了すると実際の文字列値を生成するコミットメントがあります。The task represents the ongoing process for the call to GetStringAsync, with a commitment to produce an actual string value when the work is complete.

  4. getStringTask が待機しないため、AccessTheWebAsyncGetStringAsync からの最終結果に依存しない他の作業を続行できます。Because getStringTask hasn't been awaited yet, AccessTheWebAsync can continue with other work that doesn't depend on the final result from GetStringAsync. この作業は同期メソッド DoIndependentWork への呼び出しによって表されます。That work is represented by a call to the synchronous method DoIndependentWork.

  5. DoIndependentWork は、作業を実行し、呼び出し元に戻る同期メソッドです。DoIndependentWork is a synchronous method that does its work and returns to its caller.

  6. AccessTheWebAsyncgetStringTask からの結果なしで実行できる作業を使い果たしました。AccessTheWebAsync has run out of work that it can do without a result from getStringTask. AccessTheWebAsync は次に、ダウンロードする文字列の長さを計算しますが、メソッドに文字列が戻されるまで、メソッドはその値を計算できません。AccessTheWebAsync next wants to calculate and return the length of the downloaded string, but the method can't calculate that value until the method has the string.

    そのため、AccessTheWebAsync は await 演算子を使用してその進行を中断し、AccessTheWebAsync を呼び出したメソッドにコントロールを戻します。Therefore, AccessTheWebAsync uses an await operator to suspend its progress and to yield control to the method that called AccessTheWebAsync. AccessTheWebAsync は呼び出し元に Task<int> を返します。AccessTheWebAsync returns a Task<int> to the caller. タスクは、ダウンロードされた文字列の長さの整数値を生成することの保証を表します。The task represents a promise to produce an integer result that's the length of the downloaded string.

    注意

    GetStringAsync (および、結果として getStringTask) が AccessTheWebAsync が待機する前に完了した場合、コントロールは AccessTheWebAsync に残ります。If GetStringAsync (and therefore getStringTask) is complete before AccessTheWebAsync awaits it, control remains in AccessTheWebAsync. AccessTheWebAsync を中断して後から戻ることは、呼び出された非同期プロセス (getStringTask) が既に完了していて、AccessTheWebSync が最終結果を待つ必要がない場合に、無駄になることがあります。The expense of suspending and then returning to AccessTheWebAsync would be wasted if the called asynchronous process (getStringTask) has already completed and AccessTheWebSync doesn't have to wait for the final result.

    呼び出し元 (この例ではイベント ハンドラー) の内部で、処理パターンが続行されます。Inside the caller (the event handler in this example), the processing pattern continues. 呼び出し元は AccessTheWebAsync からの結果に依存しない他の作業をすることもあり、または直ちに待機状態になることもあります。The caller might do other work that doesn't depend on the result from AccessTheWebAsync before awaiting that result, or the caller might await immediately. イベント ハンドラーは AccessTheWebAsync を待機し、AccessTheWebAsync は、GetStringAsync を待機します。The event handler is waiting for AccessTheWebAsync, and AccessTheWebAsync is waiting for GetStringAsync.

  7. GetStringAsync が完了し、文字列の結果を生成します。GetStringAsync completes and produces a string result. 文字列の結果は、GetStringAsync への呼び出しによって、意図した形式では戻されません。The string result isn't returned by the call to GetStringAsync in the way that you might expect. (メソッドは既に手順 3 のタスクで戻されていることに注意してください)。代わりに、文字列の結果は、getStringTask メソッドの完了を表すタスク内に格納されます。(Remember that the method already returned a task in step 3.) Instead, the string result is stored in the task that represents the completion of the method, getStringTask. await 演算子は、getStringTask から結果を取得します。The await operator retrieves the result from getStringTask. 代入ステートメントは urlContents に取得された結果を割り当てます。The assignment statement assigns the retrieved result to urlContents.

  8. AccessTheWebAsync に文字列の結果がある場合、メソッドは文字列の長さを計算できます。When AccessTheWebAsync has the string result, the method can calculate the length of the string. 次に AccessTheWebAsync の作業も完了し、待機しているイベント ハンドラーが再開できます。Then the work of AccessTheWebAsync is also complete, and the waiting event handler can resume. トピックの最後にある完全なサンプルでは、イベント ハンドラーが長さの結果の値を取得して印刷することを確認できます。In the full example at the end of the topic, you can confirm that the event handler retrieves and prints the value of the length result.
    非同期プログラミングの経験がない場合、同期および非同期の動作の違いを、少し時間を割いて考慮してください。If you are new to asynchronous programming, take a minute to consider the difference between synchronous and asynchronous behavior. 同期メソッドは作業が完了すると戻されます (手順 5.) が、非同期のメソッドは、作業が中断されるとタスクの値を戻します。(手順 3. および 6.)A synchronous method returns when its work is complete (step 5), but an async method returns a task value when its work is suspended (steps 3 and 6). 非同期のメソッドが最終的に作業を完了すると、タスクは完了とマークされ、結果が存在する場合はタスクに格納されます。When the async method eventually completes its work, the task is marked as completed and the result, if any, is stored in the task.

制御フローの詳細については、「非同期プログラムにおける制御フロー (C#)」を参照してください。For more information about control flow, see Control Flow in Async Programs (C#).

API の非同期メソッドAPI async methods

非同期のプログラミングをサポートする GetStringAsync などのメソッドがどこにあるのかということです。You might be wondering where to find methods such as GetStringAsync that support async programming. .NET Framework 4.5 以降および .NET Core には、async および await で使用する多くのメンバーが含まれています。The .NET Framework 4.5 or higher and .NET Core contain many members that work with async and await. メンバー名に付記されている "Async" というサフィックスと、その戻り値の型である Task または Task<TResult> から識別できます。You can recognize them by the "Async" suffix that’s appended to the member name, and by their return type of Task or Task<TResult>. たとえば、System.IO.Stream のクラスには、同期メソッドの CopyToRead、および Write と共に、CopyToAsyncReadAsync および WriteAsync という同期メソッドが含まれています。For example, the System.IO.Stream class contains methods such as CopyToAsync, ReadAsync, and WriteAsync alongside the synchronous methods CopyTo, Read, and Write.

Windows ランタイムにも、Windows アプリの asyncawait で使用できる多くのメソッドが含まれています。The Windows Runtime also contains many methods that you can use with async and await in Windows apps. 詳細およびサンプル メソッドについては、「クイック スタート: await 演算子を使用した非同期プログラミング」、「非同期プログラミング (Windows ストア アプリ)」、および「WhenAny: .NET Framework と Windows ランタイム間のブリッジ」を参照してください。For more information and example methods, see Quickstart: using the await operator for asynchronous programming, Asynchronous programming (Windows Store apps), and WhenAny: Bridging between the .NET Framework and the Windows Runtime.

スレッドThreads

非同期のメソッドは非ブロッキング操作を意図しています。Async methods are intended to be non-blocking operations. 非同期のメソッドの await 式は、待機中のタスクの実行中に現在のスレッドをブロックしません。An await expression in an async method doesn’t block the current thread while the awaited task is running. 代わりに、式はメソッドの残りの部分の継続を登録し、非同期のメソッドの呼び出し元にコントロールを戻します。Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method.

async および await キーワードは、追加のスレッドを作成する要因にはなりません。The async and await keywords don't cause additional threads to be created. 非同期のメソッドは自分自身のスレッドで実行しないため、マルチスレッドは必要ありません。Async methods don't require multithreading because an async method doesn't run on its own thread. メソッドは、現在の同期コンテキストで実行し、メソッドがアクティブな場合に限りスレッドの時間を使用します。The method runs on the current synchronization context and uses time on the thread only when the method is active. Task.Run を使用して、CPU バインディングの作業をバックグラウンド スレッドに移動できますが、バックグラウンド スレッドは、結果を待つだけのプロセスを援助しません。You can use Task.Run to move CPU-bound work to a background thread, but a background thread doesn't help with a process that's just waiting for results to become available.

非同期プログラミングへの非同期ベースのアプローチは、ほぼすべてのケースの既存のアプローチに推奨されます。The async-based approach to asynchronous programming is preferable to existing approaches in almost every case. 特に、このアプローチはコードがシンプルで競合状態からの保護の必要がないため、I/O バインディングの操作では、BackgroundWorker クラスよりも優れています。In particular, this approach is better than the BackgroundWorker class for IO-bound operations because the code is simpler and you don't have to guard against race conditions. Task.Run メソッドと組み合わせると、非同期のプログラミングは CPU バインディングの操作に関して BackgroundWorker よりも優れています。非同期のプログラミングは、Task.Run がスレッド プールから移動する作業から、実行するコードの調整の詳細を分離するためです。In combination with the Task.Run method, async programming is better than BackgroundWorker for CPU-bound operations because async programming separates the coordination details of running your code from the work that Task.Run transfers to the threadpool.

async と awaitasync and await

async 修飾子を使用して、メソッドが非同期メソッドであることを指定すると、次の 2 つの機能が有効になります。If you specify that a method is an async method by using the async modifier, you enable the following two capabilities.

  • マークされた非同期のメソッドは中断ポイントを示すために await を使用できます。The marked async method can use await to designate suspension points. await 演算子は、非同期のメソッドが、待機中の非同期のプロセスが完了するまでこのポイント以降を続行できないことを、コンパイラに指示します。The await operator tells the compiler that the async method can't continue past that point until the awaited asynchronous process is complete. その間、コントロールは非同期のメソッドの呼び出し元に戻されます。In the meantime, control returns to the caller of the async method.

    非同期のメソッドの await 式での中断は、メソッドからの終了を意図するものではなく、finally ブロックは実行されません。The suspension of an async method at an await expression doesn't constitute an exit from the method, and finally blocks don’t run.

  • マークされた非同期のメソッド自体は、呼び出し元のメソッドによって待機できます。The marked async method can itself be awaited by methods that call it.

非同期のメソッドには、通常の await 演算子が 1 つ以上ありますが、await 式がない場合もコンパイラ エラーの原因にはなりません。An async method typically contains one or more occurrences of an await operator, but the absence of await expressions doesn’t cause a compiler error. 中断ポイントをマークするために非同期のメソッドが await 演算子を使用しない場合、async 修飾子が存在しても、メソッドは同期メソッドと同様に実行されます。If an async method doesn’t use an await operator to mark a suspension point, the method executes as a synchronous method does, despite the async modifier. このようなメソッドには、コンパイラが警告を発行します。The compiler issues a warning for such methods.

asyncawait は、コンテキスト キーワードです。async and await are contextual keywords. 詳細およびサンプルについては、次のトピックを参照してください:For more information and examples, see the following topics:

戻り値の型およびパラメーターReturn types and parameters

非同期メソッドは、通常 Task または Task<TResult> を返します。An async method typically returns a Task or a Task<TResult>. 非同期のメソッド内で、await 演算子は、他の非同期のメソッドへの呼び出しから戻されたタスクに適用されます。Inside an async method, an await operator is applied to a task that's returned from a call to another async method.

メソッドが、TResult 型のオペランドを指定する Return ステートメントを含む場合、Task<TResult> を戻り値の型として指定します。You specify Task<TResult> as the return type if the method contains a return statement that specifies an operand of type TResult.

メソッドに Return ステートメントがない場合、または Return ステートメントがオペランドを戻さない場合、Task を戻り値の型として使用します。You use Task as the return type if the method has no return statement or has a return statement that doesn't return an operand.

C# 7 以降では、その型に GetAwaiter メソッドがある場合に限り、別の戻り値の型を指定できます。Starting with C# 7, you can also specify any other return type, provided that that type includes a GetAwaiter method. このような型の例として、ValueTask<TResult> が挙げられます。ValueTask<TResult> is an example of such a type. これは、System.Threading.Tasks.Extension NuGet パッケージにあります。It is available in the System.Threading.Tasks.Extension NuGet package.

次のサンプルは、Task<TResult> または Task を戻すメソッドを宣言し、呼び出す方法を示します。The following example shows how you declare and call a method that returns a Task<TResult> or a Task.

// Signature specifies Task<TResult>  
async Task<int> TaskOfTResult_MethodAsync()  
{  
    int hours;  
    // . . .  
    // Return statement specifies an integer result.  
    return hours;  
}  

// Calls to TaskOfTResult_MethodAsync  
Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync();  
int intResult = await returnedTaskTResult;  
// or, in a single statement  
int intResult = await TaskOfTResult_MethodAsync();  

// Signature specifies Task  
async Task Task_MethodAsync()  
{  
    // . . .  
    // The method has no return statement.    
}  

// Calls to Task_MethodAsync  
Task returnedTask = Task_MethodAsync();  
await returnedTask;  
// or, in a single statement  
await Task_MethodAsync();  

それぞれ、進行中の作業を示すタスクを戻します。Each returned task represents ongoing work. タスクに非同期処理の状態に関する情報、および最終的にはプロセスからの最終結果、またはプロセスが成功しなかった場合に発生する例外をカプセル化します。A task encapsulates information about the state of the asynchronous process and, eventually, either the final result from the process or the exception that the process raises if it doesn't succeed.

非同期のメソッドの戻り値の型としては、void を指定できます。An async method can also have a void return type. この戻り値の型は主として、void の戻り値の型が必要なイベント ハンドラーの定義に使用されます。This return type is used primarily to define event handlers, where a void return type is required. 非同期のイベント ハンドラーは通常、非同期のプログラムの開始点として機能します。Async event handlers often serve as the starting point for async programs.

void の戻り値の型を持つ非同期のメソッドは、待機できません。void を戻すメソッドの呼び出し元は、このメソッドがスローする例外をキャッチできません。An async method that has a void return type can’t be awaited, and the caller of a void-returning method can't catch any exceptions that the method throws.

非同期のメソッドで ref パラメーターまたは out パラメーターを宣言することはできませんが、これらのパラメーターを持つメソッドを呼び出すことはできます。An async method can't declare ref or out parameters, but the method can call methods that have such parameters. 同様に、非同期メソッドは ref 戻り値を使用してメソッドを呼び出すことはできますが、参照を使用して値を返すことはできません。Similarly, an async method can't return a value by reference, although it can call methods with ref return values.

使用例を含む詳細については、「非同期の戻り値の型 (C#)」を参照してください。For more information and examples, see Async Return Types (C#). 非同期のメソッドで例外をキャッチする方法の詳細については、「try-catch」を参照してください。For more information about how to catch exceptions in async methods, see try-catch.

Windows ランタイム プログラミングの非同期 API には、タスクに類似した次のような戻り値の型の 1 つがあります。Asynchronous APIs in Windows Runtime programming have one of the following return types, which are similar to tasks:

詳細およびサンプルついては、「クイック スタート: 非同期プログラミングに await 演算子を使用する」を参照してください。For more information and an example, see Quickstart: using the await operator for asynchronous programming.

名前付け規則Naming convention

慣例により、async 修飾子を持つメソッドの名前には、"Async" を追加します。By convention, you append "Async" to the names of methods that have an async modifier.

イベント、基底クラス、またはインターフェイスのコントラクトが別の名前を表示している場合は、この慣例を無視できます。You can ignore the convention where an event, base class, or interface contract suggests a different name. たとえば、Button1_Click などの共通のイベント ハンドラーの名前は、変更しないことをお勧めします。For example, you shouldn’t rename common event handlers, such as Button1_Click.

関連トピックとサンプル (Visual Studio)Related topics and samples (Visual Studio)

タイトルTitle 説明Description サンプルSample
チュートリアル: async と await を使用した Web へのアクセス (C#)Walkthrough: Accessing the Web by Using async and await (C#) 同期 WPF のソリューションを非同期 WPF のソリューションに変換する方法を示します。Shows how to convert a synchronous WPF solution to an asynchronous WPF solution. アプリケーションは、一連の Web サイトをダウンロードします。The application downloads a series of websites. Async Sample: Accessing the Web Walkthrough (非同期のサンプル: Web サイトへのアクセスのチュートリアル)Async Sample: Accessing the Web Walkthrough
方法: Task.WhenAll を使用して AsyncWalkthrough を拡張する (C#)How to: Extend the async Walkthrough by Using Task.WhenAll (C#) 前のチュートリアルに Task.WhenAll を追加します。Adds Task.WhenAll to the previous walkthrough. WhenAll を使用すると、すべてのダウンロードが同時に開始します。The use of WhenAll starts all the downloads at the same time.
方法: async と await を使用して複数の Web 要求を並列実行するHow to: Make Multiple Web Requests in Parallel by Using async and await (C#) 複数のタスクを同時に開始する方法を示します。Demonstrates how to start several tasks at the same time. Async Sample: Make Multiple Web Requests in Parallel (非同期のサンプル: 複数の並行 Web 要求の作成)Async Sample: Make Multiple Web Requests in Parallel
非同期の戻り値の型 (C#)Async Return Types (C#) 非同期のメソッドが戻す型、および各型の適切な使用方法を説明します。Illustrates the types that async methods can return and explains when each type is appropriate.
非同期プログラムにおける制御フロー (C#)Control Flow in Async Programs (C#) 非同期プログラムでの await 式を継続して、コントロールのフローの詳細をトレースします。Traces in detail the flow of control through a succession of await expressions in an asynchronous program. Async Sample: Control Flow in Async Programs (非同期のサンプル: 非同期プログラムにおける制御フロー)Async Sample: Control Flow in Async Programs
非同期アプリケーションの微調整 (C#)Fine-Tuning Your Async Application (C#) 非同期のソリューションに次の機能を追加する方法を示します:Shows how to add the following functionality to your async solution:

- 非同期タスクまたはタスクの一覧のキャンセル (C#)- Cancel an Async Task or a List of Tasks (C#)
- 指定した時間の経過後の非同期タスクのキャンセル (C#)- Cancel Async Tasks after a Period of Time (C#)
- 完了後の残りの非同期タスクのキャンセル (C#)- Cancel Remaining Async Tasks after One Is Complete (C#)
- 完了時での複数の非同期タスクとプロセスの実行 (C#)- Start Multiple Async Tasks and Process Them As They Complete (C#)
Async Sample: Fine Tuning Your Application (非同期のサンプル: アプリケーションの微調整)Async Sample: Fine Tuning Your Application
非同期アプリにおける再入の処理 (C#)Handling Reentrancy in Async Apps (C#) 実行中にアクティブな非同期操作を再起動するケースの処理方法を示します。Shows how to handle cases in which an active asynchronous operation is restarted while it’s running.
WhenAny: .NET Framework と Windows ランタイム間のブリッジWhenAny: Bridging between the .NET Framework and the Windows Runtime Windows ランタイムWindows Runtime のメソッドの WhenAny を使用可能にするために、Windows ランタイムWindows Runtime で、.NET Framework および IAsyncOperations のタスクの種類間をブリッジする方法を示します。Shows how to bridge between Task types in the .NET Framework and IAsyncOperations in the Windows ランタイムWindows Runtime so that you can use WhenAny with a Windows ランタイムWindows Runtime method. Async Sample: Bridging between .NET and Windows Runtime (AsTask and WhenAny) (非同期のサンプル: .NET と Windows ランタイム間のブリッジ (AsTask と WhenAny))Async Sample: Bridging between .NET and Windows Runtime (AsTask and WhenAny)
非同期のキャンセル: .NET Framework と Windows ランタイム間のブリッジAsync Cancellation: Bridging between the .NET Framework and the Windows Runtime Windows ランタイムWindows Runtime のメソッドの CancellationTokenSource を使用可能にするために、Windows ランタイムWindows Runtime で、.NET Framework および IAsyncOperations のタスクの種類間をブリッジする方法を示します。Shows how to bridge between Task types in the .NET Framework and IAsyncOperations in the Windows ランタイムWindows Runtime so that you can use CancellationTokenSource with a Windows ランタイムWindows Runtime method. Async Sample: Bridging between .NET and Windows Runtime (AsTask & Cancellation) (非同期のサンプル: .NET と Windows ランタイム間のブリッジ (AsTask と Cancellation))Async Sample: Bridging between .NET and Windows Runtime (AsTask & Cancellation)
ファイル アクセスにおける非同期の使用 (C#)Using Async for File Access (C#) async および await を使用してファイルにアクセスすることの利点の一覧と紹介です。Lists and demonstrates the benefits of using async and await to access files.
タスク ベースの非同期パターン (TAP)Task-based Asynchronous Pattern (TAP) .NET Framework での非同期性の新しいパターンについて説明します。Describes a new pattern for asynchrony in the .NET Framework. パターンは Task および Task<TResult> の型に基づいています。The pattern is based on the Task and Task<TResult> types.
Channel 9 の非同期に関するビデオAsync Videos on Channel 9 非同期のプログラミングに関するさまざまなビデオへのリンクを示します。Provides links to a variety of videos about async programming.

コード例全体Complete example

次のコードは、このトピックで説明する Windows Presentation Foundation (WPF) アプリケーションの MainWindow.xaml.cs ファイルです。The following code is the MainWindow.xaml.cs file from the Windows Presentation Foundation (WPF) application that this topic discusses. サンプルは、「Async Sample: Example from "Asynchronous Programming with Async and Await" (非同期のサンプル: 「Async および Await を使用した非同期プログラミング」の例)」からダウンロードできます。You can download the sample from Async Sample: Example from "Asynchronous Programming with Async and Await".

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using System.Windows;  
using System.Windows.Controls;  
using System.Windows.Data;  
using System.Windows.Documents;  
using System.Windows.Input;  
using System.Windows.Media;  
using System.Windows.Media.Imaging;  
using System.Windows.Navigation;  
using System.Windows.Shapes;  

// Add a using directive and a reference for System.Net.Http;  
using System.Net.Http;  

namespace AsyncFirstExample  
{  
    public partial class MainWindow : Window  
    {  
        // Mark the event handler with async so you can use await in it.  
        private async void StartButton_Click(object sender, RoutedEventArgs e)  
        {  
            // Call and await separately.  
            //Task<int> getLengthTask = AccessTheWebAsync();  
            //// You can do independent work here.  
            //int contentLength = await getLengthTask;  

            int contentLength = await AccessTheWebAsync();  

            resultsTextBox.Text +=  
                String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);  
        }  

        // Three things to note in the signature:  
        //  - The method has an async modifier.   
        //  - The return type is Task or Task<T>. (See "Return Types" section.)  
        //    Here, it is Task<int> because the return statement returns an integer.  
        //  - The method name ends in "Async."  
        async Task<int> AccessTheWebAsync()  
        {   
            // You need to add a reference to System.Net.Http to declare client.  
            HttpClient client = new HttpClient();  

            // GetStringAsync returns a Task<string>. That means that when you await the  
            // task you'll get a string (urlContents).  
            Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");  

            // You can do work here that doesn't rely on the string from GetStringAsync.  
            DoIndependentWork();  

            // The await operator suspends AccessTheWebAsync.  
            //  - AccessTheWebAsync can't continue until getStringTask is complete.  
            //  - Meanwhile, control returns to the caller of AccessTheWebAsync.  
            //  - Control resumes here when getStringTask is complete.   
            //  - The await operator then retrieves the string result from getStringTask.  
            string urlContents = await getStringTask;  

            // The return statement specifies an integer result.  
            // Any methods that are awaiting AccessTheWebAsync retrieve the length value.  
            return urlContents.Length;  
        }  

        void DoIndependentWork()  
        {  
            resultsTextBox.Text += "Working . . . . . . .\r\n";  
        }  
    }  
}  

// Sample Output:  

// Working . . . . . . .  

// Length of the downloaded string: 41564.  

関連項目See Also

asyncasync
awaitawait