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 çalışmayı temsil eder.

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

Not

Async ve Await anahtar sözcükleri Visual Studio 2012'de kullanıma sunulmuştur. Zaman uyumsuz programlamaya giriş için bkz . Async ve Await ile Zaman Uyumsuz Programlama.

Genellikle, işlecini Await uyguladığınız görev, Görev Tabanlı Zaman Uyumsuz Deseni (veya Task<TResult>) uygulayan bir yöntem çağrısından dönüş değeridirTask.

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. İşleçAwait, tamamlanana kadar getContentsTask içinde SumPageSizesAsync yürütmeyi askıya almak için getContentsTask uygulanır. Bu arada, denetim öğesini çağırana SumPageSizesAsyncdöndürülür. tamamlandığında getContentsTask , Await ifade bir bayt 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 . İzlenecek Yol: Async ve Await Kullanarak Web'e Erişme. Örneği .NET Örnek Tarayıcısı'ndan 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 örnekte fark gösterilmektedir.

' 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. Ardından Denetim, zaman uyumsuz yöntemi çağırana döner. Görev tamamlandığında, devamını çağırı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 anahtar sözcük olarak görev alır. Başka bir yerde tanımlayıcı olarak yorumlanır. Async Yöntem veya lambda ifadesi içinde, bir Await sorgu ifadesinde, Try... öğesinin Catch veya Finally bloğunda bir ifade oluşamaz. Yakalamak... Finally deyimi, bir For veya For Each döngüsünün döngü denetimi değişken ifadesinde veya SyncLock deyiminin gövdesinde.

Özel durumlar

Çoğu zaman uyumsuz yöntem veya TaskTask<TResult>döndürür. Döndürülen görevin özellikleri, görevin tamamlanıp tamamlanmadığı, zaman uyumsuz yöntemin özel duruma neden olup olmadığı veya iptal edilip edilmediği ve nihai sonucun ne olduğu gibi, durumu ve geçmişi hakkında bilgi taşır. işleç Await bu özelliklere erişir.

Özel duruma neden olan bir görev döndüren zaman uyumsuz yöntem beklerseniz, 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ıtabilir. Örneğin, görev çağrısının Task.WhenAllsonucu olabilir. Böyle bir görevi beklediğiniz zaman await işlemi özel durumlardan yalnızca birini yeniden oluşturur. Ancak, hangi özel durumların yeniden oluşturulduğuna ilişkin tahminde bulunanamazsınız.

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

Örnek

Aşağıdaki Windows Forms örneği, zaman uyumsuz bir yöntemde WaitAsynchronouslyAsynckullanımını Await gösterir. Bu yöntemin davranışını davranışıyla karşıtlık.WaitSynchronously 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.