Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
Diyagramdaki sayılar aşağıdaki adımlara karşılık gelir:
Olay işleyicisi, bir eşzamansız yöntemi çağırır ve
AccessTheWebAsync
bekler.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.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çinGetStringAsync
, denetimi çağıranıAccessTheWebAsync
'e verir.GetStringAsync
TResult'un bir dize olduğu bir Task(Of TResult) döndürür veAccessTheWebAsync
görevi değişkenegetStringTask
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.getStringTask
henüz beklenilmediğinden,AccessTheWebAsync
GetStringAsync
'nin nihai sonucuna bağlı olmayan diğer çalışmalarla devam edebilir. Bu çalışma,DoIndependentWork
zaman uyumlu yöntemine yapılan bir çağrıyla temsil edilir.DoIndependentWork
, işini yapıp çağıranına geri dönen zaman uyumlu bir metottur.AccessTheWebAsync
getStringTask
sonucu olmadan yapabileceği işi kalmadı. sonrakiAccessTheWebAsync
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 veAccessTheWebAsync
adlı yönteme denetim vermek için bir await işleci kullanır.AccessTheWebAsync
çağırana birTask(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ıylagetStringTask
) tamamlanmışsa veAccessTheWebAsync
onu beklemiyorsa, kontrolAccessTheWebAsync
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önmegetStringTask
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 bekliyorAccessTheWebAsync
, veAccessTheWebAsync
bekliyorGetStringAsync
.GetStringAsync
tamamlanır ve bir dize sonucu üretir. Dize sonucu, beklediğiniz şekildeGetStringAsync
ç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ırgetStringTask
. await işlecigetStringTask
'dan sonucu alır. Atama ifadesi, alınan sonucuurlContents
'a atar.AccessTheWebAsync
dize sonucuna sahip olduğunda, yöntemi dizenin uzunluğunu hesaplayabilir. ArdındanAccessTheWebAsync
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 veFinally
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:
- IAsyncOperation(Of TResult), Task(Of TResult) öğesine karşılık gelir
- IAsyncAction, Task'e karşılık gelir.
- IAsyncActionWithProgress(Of TProgress)
- IAsyncOperationWithProgress(Of TResult, TProgress)
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_Click
gibi 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. | |
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