Async (Visual Basic)Async (Visual Basic)

Async 修飾子は、変更するメソッドまたはラムダ式が非同期であることを示します。The Async modifier indicates that the method or lambda expression that it modifies is asynchronous. このようなメソッドを非同期メソッドと呼びます。Such methods are referred to as async methods.

非同期メソッドは、呼び出し元のスレッドをブロックすることなく、実行に時間のかかる可能性のある処理を行うことができる、便利な方法です。An async method provides a convenient way to do potentially long-running work without blocking the caller's thread. 非同期メソッドの呼び出し元は、非同期メソッドの完了を待たずに作業を再開できます。The caller of an async method can resume its work without waiting for the async method to finish.

注意

Async キーワードおよび Await キーワードは、Visual Studio 2012 で導入されました。The Async and Await keywords were introduced in Visual Studio 2012. 非同期プログラミングの概要については、「 async および Await を使用した非同期プログラミング」を参照してください。For an introduction to async programming, see Asynchronous Programming with Async and Await.

次の例は、非同期メソッドの構造を示しています。The following example shows the structure of an async method. 規則により、非同期メソッドの名前の末尾は "Async" になります。By convention, async method names end in "Async."

Public Async Function ExampleMethodAsync() As Task(Of Integer)
    ' . . .

    ' At the Await expression, execution in this method is suspended and,
    ' if AwaitedProcessAsync has not already finished, control returns
    ' to the caller of ExampleMethodAsync. When the awaited task is
    ' completed, this method resumes execution.
    Dim exampleInt As Integer = Await AwaitedProcessAsync()

    ' . . .

    ' The return statement completes the task. Any method that is
    ' awaiting ExampleMethodAsync can now get the integer result.
    Return exampleInt
End Function

通常、Async キーワードによって変更されたメソッドには、少なくとも1つのAwait式またはステートメントが含まれています。Typically, a method modified by the Async keyword contains at least one Await expression or statement. メソッドは、最初の Await に到達するまで同期的に実行されますが、この時点で、待機していたタスクが完了するまで中断されます。The method runs synchronously until it reaches the first Await, at which point it suspends until the awaited task completes. その間、コントロールはメソッドの呼び出し元に戻されます。In the meantime, control is returned to the caller of the method. メソッドに Await 式またはステートメントが含まれていない場合、メソッドは中断されず、同期メソッドとして実行されます。If the method doesn't contain an Await expression or statement, the method isn't suspended and executes as a synchronous method does. Await が含まれていない非同期メソッドが存在する場合は、その状態がエラーを示す可能性があるため、コンパイラによって警告が通知されます。A compiler warning alerts you to any async methods that don't contain Await because that situation might indicate an error. 詳細については、「コンパイラエラー」を参照してください。For more information, see the compiler error.

Async キーワードは、予約されていないキーワードです。The Async keyword is an unreserved keyword. メソッドまたはラムダ式を修飾する場合にキーワードとなります。It is a keyword when it modifies a method or a lambda expression. それ以外の場合は、識別子として解釈されます。In all other contexts, it is interpreted as an identifier.

戻り値の型Return Types

非同期メソッドは、サブプロシージャ、または戻り値の型が Task または Task<TResult>関数プロシージャです。An async method is either a Sub procedure, or a Function procedure that has a return type of Task or Task<TResult>. メソッドでByRefパラメーターを宣言することはできません。The method cannot declare any ByRef parameters.

メソッドのreturnステートメントに TResult 型のオペランドが含まれている場合は、非同期メソッドの戻り値の型に Task(Of TResult) を指定します。You specify Task(Of TResult) for the return type of an async method if the Return statement of the method has an operand of type TResult. メソッドの完了時に意味のある値を返さない場合は、Task を使用します。You use Task if no meaningful value is returned when the method is completed. これにより、メソッドの呼び出しでは Task が返されますが、Task の完了時に、Await を待機している Task ステートメントは結果値を生成しません。That is, a call to the method returns a Task, but when the Task is completed, any Await statement that's awaiting the Task doesn’t produce a result value.

非同期サブルーチンは主として、Sub プロシージャが必要なイベント ハンドラーの定義に使用されます。Async subroutines are used primarily to define event handlers where a Sub procedure is required. 非同期サブルーチンの呼び出し元は、このサブルーチンを待機できず、このメソッドがスローする例外をキャッチできません。The caller of an async subroutine can't await it and can't catch exceptions that the method throws.

使用例を含む詳細については、「非同期の戻り値の型」をご覧ください。For more information and examples, see Async Return Types.

Example

次の例は、非同期のイベント ハンドラー、非同期ラムダ式、および非同期メソッドを示しています。The following examples show an async event handler, an async lambda expression, and an async method. これらの要素を使用する完全な例については、「チュートリアル: Async と Await を使用した Web へのアクセス」を参照してください。For a full example that uses these elements, see Walkthrough: Accessing the Web by Using Async and Await. チュートリアル コードは、開発者コード サンプルのページからダウンロードできます。You can download the walkthrough code from Developer Code Samples.

' An event handler must be a Sub procedure.
Async Sub button1_Click(sender As Object, e As RoutedEventArgs) Handles button1.Click
    textBox1.Clear()
    ' SumPageSizesAsync is a method that returns a Task.
    Await SumPageSizesAsync()
    textBox1.Text = vbCrLf & "Control returned to button1_Click."
End Sub

' The following async lambda expression creates an equivalent anonymous
' event handler.
AddHandler button1.Click, Async Sub(sender, e)
                              textBox1.Clear()
                              ' SumPageSizesAsync is a method that returns a Task.
                              Await SumPageSizesAsync()
                              textBox1.Text = vbCrLf & "Control returned to button1_Click."
                          End Sub

' The following async method returns a Task(Of T).
' A typical call awaits the Byte array result:
'      Dim result As Byte() = Await GetURLContents("https://msdn.com")
Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())

    ' The downloaded resource ends up in the variable named content.
    Dim content = New MemoryStream()

    ' Initialize an HttpWebRequest for the current URL.
    Dim webReq = CType(WebRequest.Create(url), HttpWebRequest)

    ' Send the request to the Internet resource and wait for
    ' the response.
    Using response As WebResponse = Await webReq.GetResponseAsync()
        ' Get the data stream that is associated with the specified URL.
        Using responseStream As Stream = response.GetResponseStream()
            ' Read the bytes in responseStream and copy them to content.
            ' CopyToAsync returns a Task, not a Task<T>.
            Await responseStream.CopyToAsync(content)
        End Using
    End Using

    ' Return the result as a byte array.
    Return content.ToArray()
End Function

参照See also