Udostępnij za pośrednictwem


Poczekać operatora (Visual Basic)

Zastosowaniu Await operator operand w wyrażeniu asynchronicznej metody lub lambda zawiesić wykonanie metody dopiero po zakończeniu zadania oczekiwany.Zadanie reprezentuje pracy w toku.

Metoda, w której Await jest używana musi mieć asynchroniczne modyfikator.Taka metoda, definiowane za pomocą Async modyfikator i zazwyczaj zawierające jeden lub więcej Await wyrażenia, jest określany jako metody asynchronicznej.

[!UWAGA]

Async i Await słowa kluczowe zostały wprowadzone w Visual Studio 2012.Aby uzyskać informacje na temat nowych funkcji w tej wersji, zobacz Nowości w Visual Studio 2012.

Wprowadzenie do programowania asynchronicznych, zobacz Asynchroniczne programowania przy użyciu asynchronicznej i poczekać (C# i Visual Basic).

Zazwyczaj zadanie, do którego zastosowano Await operator jest wartość zwracaną przez wywołanie do metody, która implementuje wzór asynchronicznych opartych na zadaniach, oznacza to, Task lub Task<TResult>.

W poniższym kodzie HttpClient metoda GetByteArrayAsync zwraca getContentsTask, Task(Of Byte()).Zadanie jest promise umożliwia utworzenie tablicy bajtowej rzeczywiste podczas dana operacja jest zakończona.Await Operator jest stosowana do getContentsTask do Wstrzymaj wykonywanie kodu w SumPageSizesAsync do getContentsTask została zakończona.W międzyczasie, sterowanie jest zwracane do rozmówcy SumPageSizesAsync.Gdy getContentsTask została zakończona, Await wyrażenie zostanie oszacowane jako tablicy 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

Na przykład pełną, zobacz Instruktaż: Dostęp do sieci Web za pomocą transmisji asynchronicznej i poczekać (C# i Visual Basic).Można pobrać próbki z Przykładów kodu autora w witrynie firmy Microsoft.W przykładzie jest w programie project AsyncWalkthrough_HttpClient.

Jeśli Await jest stosowany do wyników wywołania metody, która zwraca Task(Of TResult), typ Await wyrażenie jest TResult.Jeśli Await jest stosowany do wyników wywołania metody, która zwraca Task, Await wyrażenie nie zwraca wartości.Poniższy przykład ilustruje 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()

Await Wyrażenie lub instrukcja nie blokuje wątku, na którym jest wykonywany.Zamiast tego, powoduje kompilatora się zarejestrować w pozostałej części metody asynchronicznej po Await wyrażenie jako kontynuacja oczekiwany zadania.Następnie sterowanie jest zwracane do obiektu wywołującego metodę komunikacji asynchronicznej.Po zakończeniu zadania, wywołuje jego kontynuacji i realizacji życiorysy metoda komunikacji asynchronicznej, którym zostało przerwane.

Await Wyrażenie występuje tylko w treści natychmiast otaczający metody lub lambda wyrażenie, które charakteryzuje się Async modyfikator.Termin oczekiwać służy jako słowo kluczowe, tylko w tym kontekście.W innym miejscu jest interpretowany jako identyfikator.W wyrażeniu metody lub lambda komunikacji asynchronicznej Await wyrażenie nie może wystąpić w wyrażeniu kwerendy w catch lub finally blok z Try...CATCH...Na koniec instrukcji w pętli sterowania zmiennej wyrażeniu For lub For Each pętli, lub w treści SyncLock instrukcji.

Wyjątki

Większości metod komunikacji asynchronicznej powrócić Task lub Task<TResult>.Właściwości zadania zwracane przewożenia informacji na temat stanu i historii, takie jak czy zadanie zostało wykonane, czy metody asynchronicznej spowodował wyjątek lub została anulowana i co się.Await Operator uzyskuje dostęp do tych właściwości.

Jeśli czekają na powrót zadanie metoda komunikacji asynchronicznej, która powoduje wyjątek, Await operator rethrows wyjątku.

Jeśli czekają na zwracanie zadanie metody asynchronicznej, który został anulowany, Await operator rethrows OperationCanceledException.

Poszczególne zadania, który jest stan może odzwierciedlać wiele wyjątków.Na przykład zadanie może być skutkiem połączenia Task.WhenAll.Operacja oczekiwać poczekać na takie zadanie rethrows tylko jeden z wyjątków.Jednak nie można przewidzieć, który z tych wyjątków jest rethrown.

Przykłady obsługi błędów w transmisji asynchronicznej metod, zobacz Spróbuj...Catch...Instrukcja finally (Visual Basic).

Przykład

W poniższym przykładzie Windows Forms ilustruje użycie Await w metodzie komunikacji asynchronicznej, WaitAsynchronouslyAsync.Zachowanie tej metody, z zachowaniem kontrastu WaitSynchronously.Bez Await operator, WaitSynchronously jest uruchamiana synchronicznie, mimo stosowania Async modyfikator w jego definicji i wezwanie do Thread.Sleep w jego 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

Instruktaż: Dostęp do sieci Web za pomocą transmisji asynchronicznej i poczekać (C# i Visual Basic)

Informacje

Asynchroniczne (Visual Basic)

Koncepcje

Asynchroniczne programowania przy użyciu asynchronicznej i poczekać (C# i Visual Basic)