Await İşleci (Visual Basic)
Await operatörünü awaited görev tamamlanıncaya kadar yöntemin yürütülmesini askıya almak için zaman uyumsuz yöntem veya lambda ifadesinde bir işlenen için uygularsınız.Görev, devam eden çalışmayı temsil eder.
Await kullanan bir metodun bir Async değiştiricisi olmalıdır.Async değiştiricisi kullanılarak tanımlanmış genellikle bir veya daha fazla Await ifadesi içeren bu tür bir yöntem, bir zaman uyumsuz yöntem olarak adlandırılmıştır.
[!NOT]
Async ve Await anahtar sözcükleri Visual Studio 2012'de kullanılmaya başlanmıştır.Zaman uyumsuz programlamaya giriş için bkz. Async ve Await ile Zaman Uyumsuz Programlama (C# ve Visual Basic).
Genellikle Await operatörünün uygulandığı görevin dönüş değeri, Görev Tabanlı Zaman Uyumsuz Desen, Task i uygulayan bir yönteme yapılan veya Task bir çağrıdan dönüş değeridir.
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 işleci, getContentsTask tamamlanıncaya kadar SumPageSizesAsync içindeki yürütmeyi askıya almak için getContentsTask öğesine uygulanır.Bu sırada denetim, SumPageSizesAsync çağırana döndürülür.getContentsTask bittiğinde, Await ifadesi 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
![]() |
---|
Tam bir örnek için, bkz. İzlenecek yol: Async ve Await Kullanarak Web'e Erişme (C# ve Visual Basic).Microsoft web sitesindeki Geliştirici Kodu Örnekleri içinden örneği karşıdan yükleyebilirsiniz.Örnek, AsyncWalkthrough_HttpClient projesindedir. |
Task(Of TResult) getiren bir yöntem çağrısının sonucuna Await uygulanırsa, Await ifadesinin türü TResult olur.Eğer Await bir Task dönen bir metod çağrısının sonucuna uygulanırsa, Await ifadesi bir değer dönmez.Fark aşağıdaki örnekte gösterilmiştir.
' 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 ifadesi veya açıklaması, üzerinde yürütme yaptığı iş parçacığını engellemez.Bunun yerine, Await ifadesinden sonra derleyici yöntemin geri kalanını bekleyen görevlerin devamı olarak imzalar.Denetleyin sonra zaman uyumsuz yöntemini çağırana döner.Görev tamamlandığında, devam etmesi için çağrıda bulunur ve zamanuyumsuz yöntemin yürütülmesine kaldığı yerden devam edilir.
Await ifadesi yalnızca Async olarak işaretlenmiş anında kapatma yönteminin veya lambda ifadesinin içinde gerçekleşebilir.Await terimi sadece bu bağlamda anahtar sözcük görevi görür.Başka bir yerde bu, tanımlayıcı olarak yorumlanır.Zaman uyumsuz yöntem veya lambda ifadesi bir Await ifade içinde bir sorgu ifadesinde gerçekleştirilemez, catch veya finally bir Try...Catch...Finally blogu içinde döngü denetim değişkeni ifadeleri For veya For Each döngüsü veya gövde metninde bir SyncLock ifadesi.
Özel Durumlar
Çoğu zaman uyumsuz yöntemler bir Task veya Task döndürür.Döndürülen görevin özellikleri, görevin tam olup olmadığı, zaman uyumsuz yöntemin özel bir duruma neden olup olmadığı veya iptal edilip edilmediği ve nihai sonucun ne olduğu gibi görevin durumu geçmişi ve hakkında bilgiler taşır. Await işleci, bu özelliklere erişir.
Özel duruma neden olan, görev döndüren bir zaman uyumsuz yöntem beklerseniz, Await işleci özel durumu yeniden oluşturur.
İptal edilen bir görev döndüren zaman uyumsuz yöntemi beklerseniz, Await operatörü yeniden OperationCanceledException oluşturur.
Hatalı bir durumdaki tek bir görev, birden çok özel durumu yansıtabilir. Örneğin, görev, Task.WhenAll öğesine yapılan bir çağrının sonucu olabilir.Böyle bir görevi beklerken, bekleme işlemi özel durumlardan yalnızca birini yeniden oluşturur.Ancak özel durumlardan hangisinin yeniden oluşacağını tahmin edemezsiniz.
Zaman uyumsuz yöntemlerdeki hata işleme örnekleri için bkz. Try...Catch...Finally Deyimi (Visual Basic).
Örnek
Aşağıdaki Windows Forms örneğinde zaman uyumsuz WaitAsynchronouslyAsync yönteminde Await kullanımı açıklanmıştır.WaitSynchronously davranışı ile yöntemin davranışını karşılaştırın.Bir Await operatörü olmadan, WaitSynchronously zaman uyumlu olarak çalışır, içinde Async değiştiricisinin kullanıldığı Thread.Sleep çağrısı olması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.
Görevler
İzlenecek yol: Async ve Await Kullanarak Web'e Erişme (C# ve Visual Basic)
Başvuru
Kavramlar
Async ve Await ile Zaman Uyumsuz Programlama (C# ve Visual Basic)