Await İşleci (Visual Basic)

Await operatörünü awaited görevi tamamlanıncaya kadar, metodun yürütülmesini askıya almak için bir zaman uyumsuz metod veya lambda ifadesinde bir işlenene uygularsınız. Görev, devam eden işi temsil eder.

Kullanılan yöntemin Await Async değiştiricisi olmalıdır. Değiştirici kullanılarak tanımlanan ve genellikle bir veya daha fazla ifade içeren böyle bir yöntem, zaman uyumsuz Async Await yöntem olarak adlandırılır.

Not

ve Async anahtar Await sözcükleri 2012 Visual Studio tanıtıldı. Zaman uyumsuz programlamaya giriş için bkz. Async ve Awaitile Zaman Uyumsuz Programlama.

Genellikle, işleci uygulayan görev, bir çağrıdan Görev Tabanlı Zaman Uyumsuz Desenini uygulayan bir yönteme yapılan bir çağrıdan dönüş değeridir, yani Await bir veya Task Task<TResult> olur.

Aşağıdaki kodda, HttpClient yöntemi GetByteArrayAsync, getContentsTask, bir Task(Of Byte()) döndürür. Görev, işlem tamamlandığında gerçek bayt dizisini üretmek için bir vaattir. Awaitİşleç, getContentsTask tamamlayana kadar içinde yürütmeyi SumPageSizesAsync askıya almak getContentsTask için uygulanır. Bu arada, denetim çağıranın denetimine SumPageSizesAsync döndürülür. getContentsTasktamamlandığında ifade bir Await byte dizisi olarak değerlendirilir.

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

Önemli

Tam örnek için bkz. Adım adım kılavuz: Async Ve Await Kullanarak Web'e Erişme. Örneği .NET Örnek Tarayıcısı'dan indirebilirsiniz. Örnek kod SerialAsyncExample projesindedir.

Await getiren bir metot çağrısının sonucuna Task(Of TResult) uygulanırsa, Await ifadesinin türü TResult olur. Await, bir Task getiren bir metot çağrısının sonucuna uygulanırsa, Await ifadesi bir değer getirmez. Aşağıdaki örnek farkı göstermektedir.

' 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()

Bir Await ifadesi veya açıklaması, üzerinde yürütme yaptığı iş parçacığını engellemez. Bunun yerine, Await ifadesinden sonra, bekleyen görevlerin bir devamı olarak, derleyicinin zaman uyumsuz yöntemin geri kalanını imzalamasına yol açar. Denetim daha sonra zaman uyumsuz yöntemin çağıranı döndürür. Görev tamamlandığında devamlılığı çağrılır ve zaman uyumsuz yöntemin yürütülmesi kaldığı yerden devam eder.

Bir Await ifadesi yalnızca bir Async değiştiricisiyle işaretlenmiş bir anında kapatma metodunun veya lambda ifadesinin gövdesinde gerçekleşebilir. Await terimi yalnızca bu bağlamda bir anahtar sözcük olarak görev alır. Başka bir yerde, bu bir tanımlayıcı olarak yorumlanır. Yöntemin Async veya lambda ifadesinin içinde, Await Catch Finally try... Yakalamak... Son olarak deyimi,bir veya döngüsüne ilişkin döngü denetimi değişken ifadesinde veya For For Each SyncLock deyiminin gövdesinde.

Özel durumlar

Çoğu zaman uyumsuz yöntem veya Task dönüşleridir. Task<TResult> Döndürülen görevin özellikleri, görevin tamam olup olmadığı, zaman uyumsuz yöntemin bir özel duruma neden olup olmadığı veya iptal edildiği ve nihai sonucun ne olduğu gibi durum ve geçmişi hakkında bilgi taşır. Awaitİşleç bu özelliklere erişer.

Bir özel duruma neden olan görev döndüren zaman uyumsuz yöntemi bekliyorsanız, Await işleç özel durumu yeniden oluşturur.

İptal edilen bir görev döndüren zaman uyumsuz yöntemi beklerseniz, Await operatörü yeniden bir OperationCanceledException oluşturur.

Hatalı durumdaki tek bir görev birden çok özel durumu yansıtıyor olabilir. Örneğin, görev çağrısının sonucu Task.WhenAll olabilir. Böyle bir görevi beklerken await işlemi özel durumlardan yalnızca birini yeniden oluşturur. Ancak, hangi özel durumların yeniden olduğunu tahmin etmek mümkün değildir.

Zaman uyumsuz yöntemlerde hata işleme örnekleri için bkz. Deneyin... Yakalamak... Finally Deyimi.

Örnek

Aşağıdaki Windows Forms örneği, zaman uyumsuz Await bir yönteminde kullanımını WaitAsynchronouslyAsync göstermektedir. Bu yöntemin davranışını davranışıyla karşıtlıklı olarak WaitSynchronously kullanın. Bir Await operatörü olmadan, WaitSynchronously zaman uyumlu olarak çalışır, tanımında Async değiştiricisinin ve gövdesinde bir Thread.Sleep çağrısı kullanılmasına rağmen.

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

Ayrıca bkz.