Await — Operator (Visual Basic)

Należy stosować operator Await do argumentu operacji w metodzie asynchronicznej lub wyrażeniu lambda, aby wstrzymać wykonywanie tej metody, dopóki nie zakończy się oczekiwane zadanie.Zadanie reprezentuje pracę w toku.

Metoda, w której jest używany Await musi mieć modyfikator Async.Taka metoda, zdefiniowana za pomocą modyfikatora Async i zwykle zawierająca jedno lub więcej wyrażeń Await, jest nazywana metodą asynchroniczną.

[!UWAGA]

Słowa kluczowe Async i Await wprowadzono w programie Visual Studio 2012.Aby przeczytać wprowadzenie do programowania asynchronicznego, zobacz Programowanie asynchroniczne z Async i Await (C# i Visual Basic).

Zwykle zadanie, do którego jest stosowany operator Await, jest wartością zwracaną przez wywołanie metody, która implementuje wzorzec asynchroniczny oparty na zadaniach, którą jest Task lub Task.

W następującym kodzie metoda HttpClientGetByteArrayAsync zwraca getContentsTask, Task(Of Byte()).Zadanie jest obietnicą utworzenia rzeczywistej tablicy bajtowej na zakończenie operacji.Operator Await jest stosowany do metody getContentsTask w celu wstrzymania wykonywania w metodzie SumPageSizesAsync, dopóki nie zostanie zakończona metoda getContentsTask.W międzyczasie formant zostaje zwrócony do obiektu wywołującego SumPageSizesAsync, .Po zakończeniu getContentsTask wyrażenie Await daje w wyniku tablicę bajtów.

Private Async Function SumPageSizesAsync() As Task

    ' To use the HttpClient type in desktop apps, you must include a using directive and add a 
    ' reference for the System.Net.Http namespace.
    Dim client As HttpClient = New HttpClient() 
    ' . . . 
    Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)
    Dim urlContents As Byte() = Await getContentsTask

    ' Equivalently, now that you see how it works, you can write the same thing in a single line.
    'Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)
    ' . . .
End Function
Ważna uwagaWażne

Aby zobaczyć kompletny przykład, zobacz Wskazówki: uzyskiwanie dostępu do sieci za pomocą Async i Await (C# i Visual Basic).Można ściągnąć próbkę z na witrynie Microsoft.Przykład znajduje się w projekcie AsyncWalkthrough_HttpClient.

Jeśli operator Await jest stosowany do wyniku wywołania metody, które zwraca element Task(Of TResult), typ wyrażenia Await to TResult.Jeśli Await jest stosowany do wyniku wywołania metody, która zwraca Task, Await, wyrażenie nie zwraca wartości.Poniższy przykład ilustruje tę różnicę.

' Await used with a method that returns a Task(Of TResult).
Dim result As TResult = Await AsyncMethodThatReturnsTaskTResult()

' Await used with a method that returns a Task.
Await AsyncMethodThatReturnsTask()

Wyrażenie lub instrukcja Await nie blokuje wątku, w którym jest wykonywane.Zamiast tego powoduje, że kompilator zapisuje pozostałą metodę asynchroniczną po wyrażeniu Await jako kontynuację w zadaniu oczekiwania.Formant powraca do obiektu wywołującego metody asynchronicznej.Po zakończeniu zadania wywołuje jego kontynuację, a wykonywanie metody asynchronicznej zostaje wznowione w miejscu, w którym zostało przerwane.

Wyrażenie Await może wystąpić tylko w treści bezpośrednio otaczającej metody lub wyrażenia lambda, które jest oznaczone przez modyfikator Async.Termin Await służy jako słowo kluczowe tylko w tym kontekście.Gdzie indziej jest interpretowane jako identyfikator.W ramach metody asynchronicznej lub wyrażenia lambda, wyrażenie Await nie może wystąpić w wyrażeniu zapytania w bloku catch lub finally instrukcji Try…Catch…Finally w wyrażeniu zmiennej kontroli pętli dla pętli For lub For Each lub w treści instrukcji SyncLock.

Wyjątki

Większości metod asynchronicznych zwraca Task lub Task.Właściwości zwracanego zadania przenoszą informacje o jego stanie i historii, np., czy zadanie zostało ukończone, czy metoda async spowodowała wyjątek lub została anulowana i jaki jest wynik końcowy.Operator Await uzyskuje dostęp do tych właściwości.

Jeśli włączysz oczekiwanie na metodę asynchroniczną zwracającą zadanie, która powoduje wyjątek, operator Await ponownie zgłosi wyjątek.

Jeśli wystąpi oczekiwanie na metodę asynchroniczną zwracającą zadanie, która została anulowana, operator Await ponownie zgłosi wyjątek OperationCanceledException.

Pojedyncze zadanie w stanie błędnym może odzwierciedlać wiele wyjątków. Na przykład zadanie może być rezultatem wywołania funkcji Task.WhenAll.W przypadku użycia operacji await w zadaniu operacja ta zgłasza tylko jeden z wyjątków.Jednak nie można przewidzieć, który z tych wyjątków zostanie ponownie zgłoszony.

Aby uzyskać przykłady obsługi błędów w metodach asynchronicznych, zobacz Try...Catch...Finally — Instrukcja (Visual Basic).

Przykład

Poniższy przykład formularzy Windows Forms ilustruje użycie operatora Await w metodzie asynchronicznej WaitAsynchronouslyAsync.Porównaj zachowanie tej metody z zachowaniem WaitSynchronously.Bez operatora Await, opcja WaitSynchronously jest uruchamiana synchronicznie, mimo zastosowania modyfikatora Async w jej definicji i wywołania Thread.Sleep w jej treści.

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' Call the method that runs asynchronously.
    Dim result As String = Await WaitAsynchronouslyAsync()

    ' Call the method that runs synchronously.
    'Dim result As String = Await WaitSynchronously()

    ' Display the result.
    TextBox1.Text &= result
End Sub

' 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 Function WaitAsynchronouslyAsync() As Task(Of String)
    Await Task.Delay(10000)
    Return "Finished"
End Function

' 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 Function WaitSynchronously() As Task(Of String)
    ' Import System.Threading for the Sleep method.
    Thread.Sleep(10000)
    Return "Finished"
End Function

Zobacz też

Zadania

Wskazówki: uzyskiwanie dostępu do sieci za pomocą Async i Await (C# i Visual Basic)

Informacje

Async (Visual Basic)

Koncepcje

Programowanie asynchroniczne z Async i Await (C# i Visual Basic)