Aracılığıyla paylaş


Async ve Await ile zaman uyumsuz programlama (Visual Basic)

Zaman uyumsuz programlama kullanarak performans sorunlarını önleyebilir ve uygulamanızın genel yanıt hızını artırabilirsiniz. Ancak, zaman uyumsuz uygulamalar yazmak için geleneksel teknikler karmaşık olabilir, bu da yazmalarını, hata ayıklamalarını ve bakımlarını zorlaştırabilir.

Visual Studio 2012, .NET Framework 4.5 ve üzeri sürümlerle birlikte Windows Çalışma Zamanı'nda asenkron desteğini kullanan basitleştirilmiş bir asenkron programlama yaklaşımını tanıtmıştır. Derleyici, geliştiricinin eskiden yaptığı zor işi üstlenir ve uygulamanız eşzamanlı koda benzeyen mantıksal bir yapıyı korur. Sonuç olarak, zaman uyumsuz programlamanın tüm avantajlarını çok az çabayla elde edersiniz.

Bu konu, zaman uyumsuz programlamanın ne zaman ve nasıl kullanılacağına ilişkin genel bir bakış sağlar ve ayrıntılar ve örnekler içeren destek konularına bağlantılar içerir.

Asenkron yanıt hızını artırır

Uygulamanızın web'e erişmesi gibi engelleyici olabilecek etkinlikler için asenkroni gereklidir. Bir web kaynağına erişim bazen yavaş veya gecikmeli olabilir. Böyle bir etkinlik zaman uyumlu bir işlem içinde engellenirse, uygulamanın tamamının beklemesi gerekir. Zaman uyumsuz bir işlemde uygulama, engelleyici olabilecek görev bitene kadar web kaynağına bağımlı olmayan diğer çalışmalarla devam edebilir.

Aşağıdaki tabloda, zaman uyumsuz programlamanın yanıt hızını geliştirdiği tipik alanlar gösterilmektedir. .NET Framework 4.5 ve Windows Çalışma Zamanı'ndan listelenen API'ler zaman uyumsuz programlamayı destekleyen yöntemler içerir.

Uygulama alanı Zaman uyumsuz yöntemler içeren destekleyici API'ler
Web erişimi HttpClient, SyndicationClient
Dosyalarla çalışma StorageFile, StreamWriter, StreamReader, XmlReader
Görüntülerle çalışma MediaCapture, BitmapEncoder, BitmapDecoder
WCF programlama Zaman Uyumlu ve Zaman Uyumsuz İşlemler

Kullanıcı arabirimiyle ilgili tüm etkinlikler genellikle tek bir iş parçacığını paylaştığından, asenkron çalışma, özellikle kullanıcı arabirimi iş parçacığına erişen uygulamalar için büyük bir değer taşır. Zaman uyumlu bir uygulamada herhangi bir işlem engellenirse, tümü engellenir. Uygulamanız yanıt vermeyi durdurur ve bunun başarısız olduğu sonucuna varabilirsiniz, oysa aslında sadece bekliyor.

Zaman uyumsuz yöntemler kullandığınızda, uygulama kullanıcı arabirimine yanıt vermeye devam eder. Örneğin bir pencereyi yeniden boyutlandırabilir veya simge durumuna küçültebilir ya da bitmesini beklemek istemiyorsanız uygulamayı kapatabilirsiniz.

Asenkron tabanlı yaklaşım, asenkron işlemler tasarlarken seçim yapabileceğiniz seçenekler listesine otomatik vites eşdeğerini ekler. Yani, geleneksel zaman uyumsuz programlamanın tüm avantajlarını elde edersiniz, ancak geliştiricinin çok daha az çabasıyla.

Asenkron yöntemleri yazmak daha kolaydır

Visual Basic'teki Async ve Await anahtar sözcükleri, zaman uyumsuz programlamanın kalbidir. Bu iki anahtar sözcüğü kullanarak, neredeyse zaman uyumlu bir yöntem oluşturmak kadar kolay bir şekilde, .NET Framework veya Windows Çalışma Zamanı'ndaki kaynakları kullanarak bir asenkron yöntem oluşturabilirsiniz. "Async ve Await kullanarak tanımladığınız yöntemlere zaman uyumsuz yöntemler denir."

Aşağıdaki örnekte asenkron bir yöntem gösterilmektedir. Koddaki hemen hemen her şey size tamamen tanıdık görünmelidir. Açıklamalar, eşzamanlılık oluşturmak için eklediğiniz özellikleri belirtir.

Bu konunun sonunda tam bir Windows Presentation Foundation (WPF) örnek dosyasını bulabilir ve "Async ve Await ile Zaman Uyumsuz Programlama" adlı bölümden Async Örneği: Örnek indirebilirsiniz.

' Three things to note about writing an Async Function:
'  - The function has an Async modifier.
'  - Its return type is Task or Task(Of T). (See "Return Types" section.)
'  - As a matter of convention, its name ends in "Async".
Async Function AccessTheWebAsync() As Task(Of Integer)
    Using client As New HttpClient()
        ' Call and await separately.
        '  - AccessTheWebAsync can do other things while GetStringAsync is also running.
        '  - getStringTask stores the task we get from the call to GetStringAsync.
        '  - Task(Of String) means it is a task which returns a String when it is done.
        Dim getStringTask As Task(Of String) =
            client.GetStringAsync("https://learn.microsoft.com/dotnet")
        ' You can do other work here that doesn't rely on the string from GetStringAsync.
        DoIndependentWork()
        ' The Await operator suspends AccessTheWebAsync.
        '  - AccessTheWebAsync does not continue until getStringTask is complete.
        '  - Meanwhile, control returns to the caller of AccessTheWebAsync.
        '  - Control resumes here when getStringTask is complete.
        '  - The Await operator then retrieves the String result from getStringTask.
        Dim urlContents As String = Await getStringTask
        ' The Return statement specifies an Integer result.
        ' A method which awaits AccessTheWebAsync receives the Length value.
        Return urlContents.Length

    End Using

End Function

AccessTheWebAsync, GetStringAsync çağırma ve tamamlanmasını bekleme arasında gerçekleştirebileceği bir çalışma yoksa, kodunuzu aşağıdaki tek deyimde çağırıp bekleyerek basitleştirebilirsiniz.

Dim urlContents As String = Await client.GetStringAsync()

Aşağıdaki özellikler, önceki örneği zaman uyumsuz bir yöntem yapan özellikleri özetler:

  • Yöntem imzası bir Async değiştirici içerir.

  • Asenkron bir yöntemin adı, geleneksel olarak "Async" soneki ile biter.

  • Dönüş türü, aşağıdaki türlerden biridir:

    • Yönteminizde işlenenin TResult türüne sahip olduğu bir dönüş deyimi varsa Task(Of TResult).
    • Yönteminizin return deyimi yoksa veya işleneni olmayan bir return deyimi varsa Task.
    • Zaman uyumsuz bir olay işleyicisi yazıyorsanız sub.

    Daha fazla bilgi için bu konunun devamında yer alan "Dönüş Türleri ve Parametreleri" bölümüne bakın.

  • Yöntem genellikle en az bir bekleme ifadesi içerir. Bu ifade, yöntemin, beklenen zaman uyumsuz işlem tamamlanana kadar devam edemediği bir noktayı işaret eder. Bu arada, yöntem askıya alınır ve denetim yöntemin çağıranına geri döner. Bu konunun sonraki bölümünde, askıya alma noktasında neler olduğu gösterilmektedir.

Zaman uyumsuz yöntemlerde, ne yapmak istediğinizi belirtmek için sağlanan anahtar sözcükleri ve türleri kullanırsınız ve denetim askıya alınmış bir yöntemde bir bekleme noktasına döndüğünde ne olması gerektiğini izlemek de dahil olmak üzere gerisini derleyici yapar. Döngüler ve özel durum işleme gibi bazı rutin işlemlerin geleneksel zaman uyumsuz kodda işlenmesi zor olabilir. Zaman uyumsuz bir yöntem içinde, bu öğeleri zaman uyumlu bir çözümde yazacağınız şekilde yazarsınız ve sorun çözülür.

.NET Framework'ün önceki sürümlerinde zaman uyumsuzlığı hakkında daha fazla bilgi için bkz. TPL ve Geleneksel .NET Framework Zaman Uyumsuz Programlama.

Async yönteminde ne olur?

Zaman uyumsuz programlamada anlaşılması gereken en önemli şey, denetim akışının yöntemden yönteme nasıl geçtiğidir. Aşağıdaki diyagram sizi süreç boyunca yönlendirir:

Asenkron bir programın takibini gösteren diyagram.

Diyagramdaki sayılar aşağıdaki adımlara karşılık gelir:

  1. Olay işleyicisi, bir eşzamansız yöntemi çağırır ve AccessTheWebAsync bekler.

  2. AccessTheWebAsync bir HttpClient örneği oluşturur ve bir web sitesinin içeriğini dize olarak indirmek için GetStringAsync zaman uyumsuz yöntemini çağırır.

  3. GetStringAsync'ın ilerlemesini askıya alan bir şey olur. Belki de bir web sitesinin indirilmesini veya başka bir engelleme etkinliğini beklemesi gerekir. Kaynakları engellemekten kaçınmak için GetStringAsync, denetimi çağıranı AccessTheWebAsync'e verir.

    GetStringAsync TResult'un bir dize olduğu bir Task(Of TResult) döndürür ve AccessTheWebAsync görevi değişkene getStringTask atar. Görev, GetStringAsyncçağrısının devam eden işlemini, iş tamamlandığında gerçek bir metin değeri üretme taahhüdüyle temsil eder.

  4. getStringTask henüz beklenilmediğinden, AccessTheWebAsyncGetStringAsync'nin nihai sonucuna bağlı olmayan diğer çalışmalarla devam edebilir. Bu çalışma, DoIndependentWorkzaman uyumlu yöntemine yapılan bir çağrıyla temsil edilir.

  5. DoIndependentWork, işini yapıp çağıranına geri dönen zaman uyumlu bir metottur.

  6. AccessTheWebAsync getStringTasksonucu olmadan yapabileceği işi kalmadı. sonraki AccessTheWebAsync indirilen dizenin uzunluğunu hesaplamak ve döndürmek istiyor, ancak yöntem dizeye sahip olana kadar bu değeri hesaplayamaz.

    Bu nedenle, AccessTheWebAsync ilerleme durumunu askıya almak ve AccessTheWebAsyncadlı yönteme denetim vermek için bir await işleci kullanır. AccessTheWebAsync çağırana bir Task(Of Integer) döndürür. Görev, indirilen dizenin uzunluğu olan bir tamsayı sonucu üretmeye yönelik bir vaattir.

    Uyarı

    Eğer GetStringAsync (ve dolayısıyla getStringTask) tamamlanmışsa ve AccessTheWebAsync onu beklemiyorsa, kontrol AccessTheWebAsync içinde kalır. Çağrılan zaman uyumsuz işlem (AccessTheWebAsync) zaten tamamlandıysa ve AccessTheWebSync'in nihai sonucu beklemesi gerekmiyorsa, askıya alma ve geri dönme getStringTask giderleri boşa gider.

    Çağıranın (bu örnekteki olay işleyicisi) içinde işleme düzeni devam eder. Çağıran, bu sonucu beklemeden önce AccessTheWebAsync sonucuna bağlı olmayan başka işler de yapabilir veya çağıran hemen bekler. Olay işleyicisi bekliyor AccessTheWebAsync, ve AccessTheWebAsync bekliyor GetStringAsync.

  7. GetStringAsync tamamlanır ve bir dize sonucu üretir. Dize sonucu, beklediğiniz şekilde GetStringAsync çağrısı tarafından döndürülmüyor. (Yöntemin 3. adımda zaten bir görev döndürdüğünü unutmayın.) Bunun yerine, dize sonucu yönteminin tamamlanmasını temsil eden görevde depolanır getStringTask. await işleci getStringTask'dan sonucu alır. Atama ifadesi, alınan sonucu urlContents'a atar.

  8. AccessTheWebAsync dize sonucuna sahip olduğunda, yöntemi dizenin uzunluğunu hesaplayabilir. Ardından AccessTheWebAsync işi de tamamlanır ve bekleyen olay işleyicisi devam edebilir. Konunun sonundaki tam örnekte, olay işleyicisinin uzunluk sonucunun değerini alıp yazdırdığını onaylayabilirsiniz.

Zaman uyumsuz programlamayı yeni kullanıyorsanız, zaman uyumlu ve zaman uyumsuz davranış arasındaki farkı göz önünde bulundurmanız bir dakikanızı alır. Zaman uyumlu yöntem, çalışması tamamlandığında (5. adım) döndürür, ancak zaman uyumsuz yöntem, çalışması askıya alındığında bir görev değeri döndürür (3. ve 6. adım). Asenkron yöntem sonunda çalışmasını tamamladığında, görev tamamlanmış olarak işaretlenir ve varsa sonuç görevde depolanır.

Denetim akışı hakkında daha fazla bilgi için bkz. Zaman Uyumsuz Programlarda Denetim Akışı (Visual Basic).

API Asenkron Metotları

Eşzamansız programlamayı destekleyen GetStringAsync gibi yöntemleri nerede bulabileceğinizi merak ediyor olabilirsiniz. .NET Framework 4.5 veya sonraki sürümler, Async ve Await ile çalışan birçok bileşen içerir. Bu üyeleri, üye adına eklenen "Async" soneki ve Task, veya Task(Of TResult) dönüş türüyle tanıyabilirsiniz. Örneğin, System.IO.Stream sınıfı, CopyToAsync, ReadAsyncve WriteAsync gibi yöntemlerin yanı sıra senkron yöntemler CopyTo, Readve Write'yı içerir.

Windows Çalışma Zamanı, Windows uygulamalarında Async ve Await ile kullanabileceğiniz birçok yöntem de içerir. Daha fazla bilgi ve örnek yöntemler için bkz. C# veya Visual Basic'te zaman uyumsuz API'leri çağırma, Zaman Uyumsuz programlama (Windows Çalışma Zamanı uygulamaları) ve WhenAny: .NET Framework ile Windows Çalışma Zamanı arasında köprü oluşturma.

Konular

Eşzamansız yöntemler bloklama yapmayan işlemler olarak tasarlanmıştır. Asenkron bir yöntemdeki Await ifadesi, beklenen görev yürütülürken geçerli iş parçacığını engellemez. Bunun yerine, ifade yöntemin geri kalanını bir devam olarak kaydeder ve denetimi zaman uyumsuz yöntemin çağıranına döndürür.

Async ve Await anahtar sözcükleri ek iş parçacıklarının oluşturulmasına neden olmaz. Zaman uyumsuz bir yöntem kendi iş parçacığında çalışmadığından zaman uyumsuz yöntemler çok iş parçacıklı işlem gerektirmez. Bu yöntem geçerli eşitleme bağlamında çalışır ve yalnızca yöntem etkin olduğunda iş parçacığında zamanı kullanır. CPU'ya bağlı işi bir arka plan iş parçacığına taşımak için Task.Run kullanabilirsiniz, ancak arka plan iş parçacığı yalnızca sonuçların kullanılabilir olmasını bekleyen bir işlemde yardımcı olmaz.

Zaman uyumsuz programlamada, async tabanlı yaklaşım neredeyse her durumda mevcut yaklaşımlara tercih edilir. Özellikle bu yaklaşım, kod daha basit olduğu ve yarış koşullarına karşı korumanız gerekmediği için, BackgroundWorker'den daha iyi bir seçimdir G/Ç'ye bağlı işlemler için. ile Task.Runbirlikte, zaman uyumsuz programlama, kodunuzu çalıştırmanın koordinasyon ayrıntılarını iş parçacığı havuzuna aktaran BackgroundWorker çalışmadan ayırdığından, zaman uyumsuz programlama CPU'ya bağlı işlemlerden daha Task.Run iyidir.

Async ve Await

Eğer bir yöntemin asenkron bir yöntem olduğunu belirtmek için bir Async değiştirici kullanırsanız, aşağıdaki iki özelliği etkinleştirirsiniz.

  • İşaretli eşzamansız yöntem, askıya alma noktalarını belirlemek için Await kullanabilir. Await işleci, derleyiciye, beklenen asenkron işlem tamamlanana kadar asenkron yöntemin bu noktadan sonra devam edemeyeceğini söyler. Bu arada denetim, zaman uyumsuz yöntemi çağıran kişiye geri döner.

    Await ifadesinde eş zamansız bir yöntemin askıya alınması, yöntemden çıkışı temsil etmez ve Finally blokları çalıştırmaz.

  • İşaretlenmiş async metodu, kendisini çağıran yöntemler tarafından beklenebilir.

Zaman uyumsuz bir yöntem genellikle bir veya daha fazla Await işleci içerir, ancak Await ifadelerinin olmaması derleyici hatasına neden olmaz. Zaman uyumsuz bir yöntem bir askıya alma noktasını işaretlemek için Await işleci kullanmıyorsa, Async değiştiricisine rağmen zaman uyumlu bir yöntem olarak yürütülür. Derleyici, bu tür yöntemler için bir uyarı oluşturur.

Async ve Await bağlamsal anahtar sözcüklerdir. Daha fazla bilgi ve örnek için aşağıdaki konulara bakın:

Dönüş türleri ve parametreleri

.NET Framework programlamasında, asenkron bir yöntem genellikle bir Task veya bir TResult Görevi döndürür. Zaman uyumsuz bir yöntemin içinde, başka bir zaman uyumsuz yönteme yapılan çağrıdan döndürülen bir işleme bir Await operatörü uygulanır.

Bir yöntem bir Return deyimi içeriyorsa ve bu deyim türünde bir işlenen belirtiyorsa, dönüş türü olarak TResult belirtirsiniz.

Yöntemin dönüş deyimi yoksa veya işlenen döndürmeyen bir return deyimi varsa dönüş türü olarak Task kullanırsınız.

Aşağıdaki örnek, bir Task(Of TResult) veya bir Task döndüren bir yöntemi nasıl bildireceğinizi ve çağıracağınızı göstermektedir.

' Signature specifies Task(Of Integer)
Async Function TaskOfTResult_MethodAsync() As Task(Of Integer)

    Dim hours As Integer
    ' . . .
    ' Return statement specifies an integer result.
    Return hours
End Function

' Calls to TaskOfTResult_MethodAsync
Dim returnedTaskTResult As Task(Of Integer) = TaskOfTResult_MethodAsync()
Dim intResult As Integer = Await returnedTaskTResult
' or, in a single statement
Dim intResult As Integer = Await TaskOfTResult_MethodAsync()

' Signature specifies Task
Async Function Task_MethodAsync() As Task

    ' . . .
    ' The method has no return statement.
End Function

' Calls to Task_MethodAsync
Task returnedTask = Task_MethodAsync()
Await returnedTask
' or, in a single statement
Await Task_MethodAsync()

Döndürülen her görev devam eden çalışmayı temsil eder. Görev, asenkron işlemin durumu hakkında bilgileri kapsüller ve nihayetinde ya işlemin nihai sonucunu ya da başarılı olmazsa ortaya çıkan istisnayı içerir.

Asenkron bir yöntem de bir Sub yöntem olabilir. Bu dönüş türü öncelikle bir dönüş türünün gerekli olduğu olay işleyicilerini tanımlamak için kullanılır. Zaman uyumsuz olay işleyicileri genellikle zaman uyumsuz programlar için başlangıç noktası görevi görür.

Zaman uyumsuz bir Sub prosedür olan metot beklenemez ve çağıran, bu metodun attığı özel durumları yakalayamaz.

Zaman uyumsuz bir yöntem ByRef parametrelerini bildiremez, ancak yöntemi bu tür parametrelere sahip yöntemleri çağırabilir.

Daha fazla bilgi ve örnek için Zaman Uyumsuz Dönüş Türleri (Visual Basic) bölümüne bakın. Zaman uyumsuz yöntemlerdeki özel durumları yakalama hakkında daha fazla bilgi için Try... Catch... Finally Deyimi başlıklı sayfaya bakın.

Windows Çalışma Zamanı programlamasında asenkron API'lerin, görevlere benzer şekilde aşağıdaki dönüş türlerinden biri bulunur:

Daha fazla bilgi ve örnek için bkz. C# veya Visual Basic'te zaman uyumsuz API'leri çağırma.

Adlandırma kuralı

Kurala göre, değiştiricisi olan Async yöntemlerin adlarına "Async" eklersiniz.

Olay, temel sınıf veya arabirim sözleşmesinin farklı bir ad önerdiği kuralı yoksayabilirsiniz. Örneğin, Button1_Clickgibi yaygın olay işleyicilerini yeniden adlandırmamalısınız.

İlgili konular ve örnekler (Visual Studio)

Başlık Açıklama Örnek
İzlenecek yol: Async ve Await Kullanarak Web'e Erişme (Visual Basic) Zaman uyumlu WPF çözümünün zaman uyumsuz WPF çözümüne nasıl dönüştürüldüğünü gösterir. Uygulama bir dizi web sitesi indirir. Asenkron Örnek: Async ve Await ile Asenkron Programlama (Visual Basic)
Nasıl yapılır: Task.WhenAll Kullanarak Asenkron Kılavuzu Genişletme (Visual Basic) Önceki rehbere Task.WhenAll ekler. kullanımı WhenAll tüm indirmeleri aynı anda başlatır.
Nasıl yapılır: Async ve Await Kullanarak Birden Çok Web İsteğini Paralel Yapma (Visual Basic) Aynı anda birkaç görev başlatmayı gösterir. Asenkron Örnek: Birden Çok Web İsteğini Paralel Olarak Yapma
Asenkron Dönüş Türleri (Visual Basic) Eşzamanlı olmayan yöntemlerin döndürebileceği veri türlerini gösterir ve her türün hangi durumlarda uygun olduğunu açıklar.
Eşzamanlı Olmayan Programlarda Denetim Akışı (Visual Basic) Asenkron bir programda await ifadelerinin sıralı bir şekilde kontrol akışını detaylı bir şekilde izler. Asenkron Örnek: Asenkron Programlarda Denetim Akışı
Fine-Tuning Sizin Asenkron Uygulamanız (Visual Basic) Asenkron çözümünüze aşağıdaki işlevselliğin nasıl ekleneceğini gösterir:

- Zaman Uyumsuz Görevi veya Görev Listesini İptal Etme (Visual Basic)
- Zaman Uyumsuz Görevleri Bir Süre Sonra İptal Etme (Visual Basic)
- Biri Tamamlandıktan Sonra Kalan Zaman Uyumsuz Görevleri İptal Etme (Visual Basic)
- Birden çok asenkron görevi başlatma ve onları tamamlandıklarında işleme (Visual Basic)
Asenkron Örnek: Uygulamanızı Optimize Etme
Asenkron Uygulamalarda Yeniden Giriş İşleme (Visual Basic) Etkin bir zaman uyumsuz işlemin çalışırken yeniden başlatıldığı durumları işlemeyi gösterir.
WhenAny: .NET Framework ile Windows Çalışma Zamanı arasında köprü oluşturma .NET Framework'teki Görev türleri ile Windows Çalışma Zamanı'ndaki IAsyncOperations arasında nasıl bağlantı kurabileceğiniz ve Windows Çalışma Zamanı yönteminde WhenAny kullanabileceğiniz gösterilir. Asenkron Örnek: .NET ile Windows Çalışma Zamanı arasında köprü oluşturulması (AsTask ve WhenAny)
.NET Framework ile Windows Çalışma Zamanı Ortamı Arasında Asenkron İptal Üzerine Bağlantı Kurma .NET Framework'teki Görev türleri ile Windows Çalışma Zamanı'ndaki IAsyncOperations arasında nasıl bağlantı kurabileceğiniz ve Windows Çalışma Zamanı yönteminde CancellationTokenSource kullanabileceğiniz gösterilir. Asenkron Örnek: .NET ile Windows Çalışma Zamanı arasında köprü oluşturma (AsTask & İptal Etme)
Dosya Erişimi için Asenkron Kullanma (Visual Basic) Asenkron ve bekleme kullanarak dosyalara erişmenin faydalarını listeler ve gösterir.
Görev Tabanlı Eşzamansız Model (TAP) Bu, .NET Framework'te zaman uyumsuzluğu için yeni bir deseni açıklar. Desen, Task ve Task(Of TResult) türlerini temel almaktadır.

Tam Örnek

Aşağıdaki kod, bu konuda ele alınan Windows Presentation Foundation (WPF) uygulamasından MainWindow.xaml.vb dosyasıdır. Örneği Zaman Uyumsuz Örnek: "Async ve Await ile Zaman Uyumsuz Programlama" örneğinden indirebilirsiniz.


Imports System.Net.Http

' Example that demonstrates Asynchronous Programming with Async and Await.
' It uses HttpClient.GetStringAsync to download the contents of a website.
' Sample Output:
' Working . . . . . . .
'
' Length of the downloaded string: 39678.

Class MainWindow

    ' Mark the event handler with Async so you can use Await in it.
    Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)

        ' Call and await immediately.
        ' StartButton_Click suspends until AccessTheWebAsync is done.
        Dim contentLength As Integer = Await AccessTheWebAsync()

        ResultsTextBox.Text &= $"{vbCrLf}Length of the downloaded string: {contentLength}.{vbCrLf}"

    End Sub


    ' Three things to note about writing an Async Function:
    '  - The function has an Async modifier.
    '  - Its return type is Task or Task(Of T). (See "Return Types" section.)
    '  - As a matter of convention, its name ends in "Async".
    Async Function AccessTheWebAsync() As Task(Of Integer)

        Using client As New HttpClient()

            ' Call and await separately.
            '  - AccessTheWebAsync can do other things while GetStringAsync is also running.
            '  - getStringTask stores the task we get from the call to GetStringAsync.
            '  - Task(Of String) means it is a task which returns a String when it is done.
            Dim getStringTask As Task(Of String) =
                client.GetStringAsync("https://learn.microsoft.com/dotnet")

            ' You can do other work here that doesn't rely on the string from GetStringAsync.
            DoIndependentWork()

            ' The Await operator suspends AccessTheWebAsync.
            '  - AccessTheWebAsync does not continue until getStringTask is complete.
            '  - Meanwhile, control returns to the caller of AccessTheWebAsync.
            '  - Control resumes here when getStringTask is complete.
            '  - The Await operator then retrieves the String result from getStringTask.
            Dim urlContents As String = Await getStringTask

            ' The Return statement specifies an Integer result.
            ' A method which awaits AccessTheWebAsync receives the Length value.
            Return urlContents.Length

        End Using

    End Function

    Sub DoIndependentWork()
        ResultsTextBox.Text &= $"Working . . . . . . .{vbCrLf}"
    End Sub

End Class

Ayrıca bakınız