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 SumPageSizesAsync
dö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 WaitAsynchronouslyAsync
kullanı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