Async ve await ile zaman uyumsuz programlama (Visual Basic)
Zaman uyumsuz programlama kullanarak performans sorunlarını önleyebilir ve uygulamanızın genel yanıt verme becerisini geliştirebilirsiniz. Ancak, zaman uyumsuz uygulamalar yazmaya yönelik geleneksel teknikler karmaşık olabilir ve bu nedenle yazılmaları, hataların ayıklanması ve bakım yapılması zorlaşabilir.
Visual Studio 2012, Windows Çalışma Zamanı .NET Framework 4,5 ve daha yüksek bir zamanda zaman uyumsuz destekten yararlanan, zaman uyumsuz programlama sunan basitleştirilmiş bir yaklaşım sunmuştur. Derleyici, normalde geliştiricinin yaptığı zor işi yapar ve uygulamanız zaman uyumlu koda benzer bir mantıksal yapıyı korur. Sonuç olarak, zaman uyumsuz programlama avantajlarının tamamını çok daha az çaba harcayarak elde edebilirsiniz.
Bu konu zaman uyumsuz programlamanın ne zaman ve nasıl kullanılması gerektiği hakkında genel bakış içerir ve ayrıntılar ve örnekler içeren destek konularına bağlantılar sunar.
Zaman uyumsuz, yanıt hızını geliştirir
Zaman uyumsuzluk, uygulamanızın Web'e erişmesi gibi engelleme olasılığı bulunan faaliyetler için önemlidir. Web kaynağına erişim bazen yavaş veya gecikmeli olabilir. Böyle bir etkinlik zaman uyumlu işlemde engellenirse uygulamanın tamamı beklemelidir. Uygulama, zaman uyumsuz bir işlemde olası engelleme görevi sona erinceye kadar web kaynağına bağlı olmayan diğer işlerle devam eder.
Aşağıdaki tabloda, zaman uyumsuz programlamanın yanıt verme hızını geliştirdiği genel alanlar gösterilmektedir. .NET Framework 4,5 ve Windows Çalışma Zamanı listelenen apı 'ler, zaman uyumsuz programlamayı destekleyen yöntemler içerir.
| Uygulama alanı | Zaman uyumsuz yöntemler içeren API'leri destekleme |
|---|---|
| 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 |
Tüm kullanıcı arabirimi ilişkili faaliyetler genellikle tek bir iş parçacığını paylaştığından, zaman uyumsuzluğun kullanıcı arabirimi iş parçacığına erişen uygulamalar için özellikle önem taşıdığı kanıtlanmıştır. Herhangi bir işlem zaman uyumlu bir uygulamada engellenirse, tümü engellenir. Uygulamanız yanıt vermiyordur ve bunu uygulamanın beklediği değil de başarısız olduğu şeklinde yorumlayabilirsiniz.
Zaman uyumsuz yöntemleri kullandığınızda, uygulama arabirime yanıt vermeye devam eder. Bir pencereyi yeniden boyutlandırabilir veya simge durumuna küçültebilir ya da bitmesini beklemek istemiyorsanız kapatabilirsiniz.
Zaman uyumsuz tabanlı yaklaşım otomatik bir iletimin eşdeğerini, zaman uyumsuz işlemler tasarlarken seçebileceğiniz seçenekler listesine ekler. Diğer bir deyişle, geleneksel zaman uyumsuz programlamanın tüm avantajlarından yararlanabilirsiniz, buna rağmen geliştiricinin daha az çaba sarf etmesi gerekir.
Zaman uyumsuz yöntemlerin yazılması daha kolaydır
Visual Basic zaman uyumsuz ve Await anahtar sözcükleri zaman uyumsuz programlamanın kalbidir. bu iki anahtar sözcüğü kullanarak, bir zaman uyumlu yöntem oluştururken neredeyse kolayca zaman uyumsuz bir yöntem oluşturmak için .NET Framework veya Windows Çalışma Zamanı kaynaklarını kullanabilirsiniz. Ve kullanarak tanımladığınız zaman uyumsuz yöntemler Async Await , zaman uyumsuz yöntemler olarak adlandırılır.
Aşağıdaki örnekte zaman uyumsuz bir yöntem gösterilmektedir. Kodda yer alan hemen hemen her şey size tamamen tanıdık gelmiş olmalıdır. Açıklamalar, zaman uyumsuzluğu eklemek için oluşturduğunuz özellikleri çağırır.
bu konunun sonunda bir Windows Presentation Foundation (WPF) örnek dosyası bulabilirsiniz ve örneği zaman uyumsuz örnek: "async ve Await ile zaman uyumsuz programlama" kaynağındanindirebilirsiniz.
' 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://docs.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Çağrısı ve tamamlanmasını bekleme arasında yapabilecek herhangi bir işi yoksa GetStringAsync , aşağıdaki tek deyime çağırarak ve bekleyen kodunuzu basitleştirebilirsiniz.
Dim urlContents As String = Await client.GetStringAsync()
Aşağıdaki özellikler, önceki örneği nasıl zaman uyumsuz bir yöntem yaptığını özetler:
Yöntem imzası bir değiştirici içerir
Async.Zaman uyumsuz yöntemin adı kurala göre "Async" soneki ile sona erer.
Dönüş türü aşağıdaki türlerden biridir:
- Yönteminizin TResult türünde olan bir return ifadesine sahipse görev (TResult) .
- Task yönteminizin Return bildirisi yoksa veya işleneni olmayan bir return ifadesine sahip.
- Bir zaman uyumsuz olay işleyicisi yazıyorsanız Sub .
Daha fazla bilgi için bu konunun ilerleyen kısımlarındaki "Dönüş Türleri ve Parametreler" bölümüne bakın.
Yöntem, genellikle beklenen zaman uyumsuz işlem tamamlanana kadar devam edemediği bir noktayı işaretleyen en az bir await ifadesi içerir. Bu sırada yöntem askıya alınır ve denetim yöntemi arayana 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ınan bir yöntemde await noktasına geldiğinde olması gerekenlerin izlenmesi dahil olmak üzere geri kalan işlemleri derleyici yapar. Döngüler ve özel durum işleme gibi bazı rutin işlemlerin geleneksel zaman uyumsuz kodla yapılması zor olabilir. Zaman uyumsuz bir yöntemde, bu öğeleri olabildiğince zaman uyumlu çözümde yazarsınız ve sorun çözülür.
.NET Framework önceki sürümlerinde zaman uyumsuzluğu hakkında daha fazla bilgi için bkz. TPL ve geleneksel .NET Framework zaman uyumsuz programlama.
Zaman uyumsuz bir yöntemde ne olur?
Zaman uyumsuz programlama ile ilgili olarak anlamanız gereken en önemli şey, denetim akışının yöntemden yönteme nasıl geçtiğidir. Aşağıdaki diyagramda süreç boyunca size yol gösterir:

Diyagramdaki sayılar aşağıdaki adımlara karşılık gelir:
Bir olay işleyicisi,
AccessTheWebAsynczaman uyumsuz yöntemini çağırır ve bekler.AccessTheWebAsyncbir HttpClient örnek oluşturur ve GetStringAsync bir Web sitesinin içeriklerini dize olarak indirmek için zaman uyumsuz yöntemi çağırır.İçinde
GetStringAsyncilerleme durumunu askıya alan bir sorun var. Bir web sitesinin indirmesini veya başka bir engelleyen etkinliği beklemesi gerekebilir. Kaynakları engellemeyi önlemek için,GetStringAsynckendi çağıranına denetim verirAccessTheWebAsync.GetStringAsyncTResult bir dize olduğu ve bu görevi değişkenine atayan bir görev (TResult) döndürürAccessTheWebAsyncgetStringTask. Görev,GetStringAsynciş tamamlandığında gerçek bir dize değeri üretme taahhüdünde, çağrısı için devam eden işlemi temsil eder.Henüz beklenmediği
getStringTaskAccessTheWebAsynciçin, nihai sonuca bağlı olmayan diğer çalışmalarla devam edebilirGetStringAsync. Bu iş, zaman uyumlu yöntem çağrısıyla temsil edilirDoIndependentWork.DoIndependentWork, işini yapan ve çağırana döndüren zaman uyumlu bir yöntemdir.AccessTheWebAsync, uygulamasından bir sonuç olmadan yapabilmeden iş dışında çalışıyorgetStringTask.AccessTheWebAsyncardından, indirilen dizenin uzunluğunu hesaplamak ve döndürmek ister, ancak yöntem dizeye gelinceye kadar bu değeri hesaplayamaz.Bu nedenle,
AccessTheWebAsyncilerleme durumunu askıya almak ve denetimi çağıran yönteme eklemek için bir Await işleci kullanırAccessTheWebAsync.AccessTheWebAsyncçağırana döndürürTask(Of Integer). Görev, indirilen dizenin uzunluğu olan bir tamsayı sonucu verecek bir taahhüdü temsil eder.Not
GetStringAsync(Ve bu nedenlegetStringTask), bekleden önce tamamlandıktan sonraAccessTheWebAsyncdenetim içinde kalırAccessTheWebAsync.AccessTheWebAsyncÇağrılan zaman uyumsuz işlem (getStringTask) zaten tamamlanmışsa ve AccessTheWebSync 'in nihai sonucu beklemesi gerekmez.Arayanın içinde (bu örnekte olay işleyicisi), işleme düzeni devam eder. Çağıran, sonucu beklemeden önce sonucu kendisine bağlı olmayan başka bir iş
AccessTheWebAsyncya da çağıran hemen bekleme edebilir. Olay işleyicisi için bekliyorAccessTheWebAsyncveAccessTheWebAsyncbekliyorGetStringAsync.GetStringAsynctamamlar ve bir dize sonucu üretir. Dize sonucu, bekleneceğiniz şekilde çağrısı tarafından döndürülmediGetStringAsync. (Metodun adım 3 ' te bir görevi zaten döndürdüğünü unutmayın.) Bunun yerine, dize sonucu, yönteminin tamamlandığını temsil eden görevde saklanırgetStringTask. Await işleci sonucunu alırgetStringTask. Atama ekstresi alındı sonucunu öğesine atarurlContents.AccessTheWebAsyncDize sonucu olduğunda, yöntemi dizenin uzunluğunu hesaplayabilir. Bu durumda, çalışmasıAccessTheWebAsyncda tamamlanır ve bekleyen olay işleyicisi sürdürülebilirler. Konunun sonundaki tam örnekte olay işleyicisinin uzunluk sonucundaki değeri aldığını ve yazdığını onaylayabilirsiniz.
Zaman uyumsuz programlama konusunda yeniyseniz, zaman uyumlu ve zaman uyumsuz davranış arasındaki farkları değerlendirmek için bir dakikanızı ayırın. Zaman uyumlu yöntem, işi tamamlandığında döndürür (5. adım), ancak zaman uyumsuz bir yöntem işi askıya alındığında görev değeri döndürür (3 ve 6. adım). Zaman uyumsuz yöntem çalışmasını tamamladığında görev tamamlandı olarak işaretlenir ve varsa sonuç görevde depolanır.
denetim akışı hakkında daha fazla bilgi için bkz. denetim Flow zaman uyumsuz programlarda (Visual Basic).
API zaman uyumsuz yöntemleri
Zaman uyumsuz programlamayı destekleyen gibi yöntemlerin nerede bulunacağını merak ediyor olabilirsiniz GetStringAsync . .NET Framework 4,5 veya üzeri, ve ile çalışan birçok üye içerir Async Await . Bu üyeleri, üye adına ve bir dönüş türüne Task (TResult)bağlı olan "Async" sonekine göre de tanıyabilirsiniz. Örneğin, sınıfı,, ve gibi System.IO.Stream yöntemleri, CopyToAsync ve ReadAsync WriteAsync ile zaman uyumlu yöntemleri içerir CopyTo Read Write .
Windows Çalışma Zamanı ayrıca, Async ve Windows uygulamalarında kullanabileceğiniz birçok yöntem içerir Await . daha fazla bilgi ve örnek yöntemler için bkz. C# veya Visual Basic zaman uyumsuz apı '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.
Akışları
Zaman uyumsuz yöntemlerin engelleyici olmayan işlemler olmaları amaçlanmıştır. AwaitZaman uyumsuz yöntemdeki bir ifade, beklenen görev çalışırken geçerli iş parçacığını engellemez. Bunun yerine ifade, yöntemin geri kalanını yöntemin devamı olarak imzalar ve denetimi zaman uyumsuz yöntemi arayan kişiye verir.
AsyncVe Await anahtar sözcükleri ek iş parçacıklarının oluşturulmasına neden olmaz. Zaman uyumsuz yöntemler kendi iş parçacığında çalışmadığından zaman uyumsuz metotlar çok iş parçacığı gerektirmez. Yöntem geçerli eşitleme kapsamının üzerinde çalışır ve yalnızca yöntem etkin olduğunda iş parçacığındaki zamanı kullanır. Task.RunCPU 'ya bağlanan işi arka plan iş parçacığına taşımak için kullanabilirsiniz, ancak arka plan iş parçacığı yalnızca sonuçların kullanılabilir hale gelmesini bekleyen bir işlem konusunda yardımcı olmaz.
Zaman uyumsuz programlamaya zaman uyumsuz yaklaşım, hemen hemen her durumda varolan yaklaşımlara tercih edilir. Özellikle, BackgroundWorker kod daha basit olduğundan ve yarış koşullarına karşı koruma sağlamak zorunda olmadığınızdan bu yaklaşım, g/ç 'ye bağlanacak işlemler için daha iyidir. , İle birlikte Task.Run zaman uyumsuz programlama, BackgroundWorker zaman uyumsuz programlama, kodunuzun iş parçacığı koduna aktaran işten kod çalıştırmanın koordinasyon ayrıntılarını AYıRDıĞıNDAN, CPU 'ya bağlanan işlemlerden daha iyidir Task.Run .
Async ve await
Bir yöntemi zaman uyumsuz bir değiştirici kullanarak zaman uyumsuz bir yöntem olduğunu belirtirseniz, aşağıdaki iki özelliği etkinleştirirsiniz.
İşaretlenen zaman uyumsuz yöntem, askıya alma noktaları belirlemek için await kullanabilir. await işleci derleyiciye, beklenen zaman uyumsuz işlem tamamlanmadan zaman uyumsuz yöntemin bu noktanın ilerisine devam edemeyeceğini bildirir. Bu sırada denetim, zaman uyumsuz yönteminin arayanına döner.
Bir ifadede zaman uyumsuz bir yöntemin askıya alınması
Awaityöntemden bir çıkış oluşturmaz veFinallybloklar çalıştırılmaz.İşaretli zaman uyumsuz yöntem, kendisinin çağırdığı yöntemler tarafından bekleniyor olabilir.
Zaman uyumsuz bir yöntem, genellikle bir işlecin bir veya daha fazla örneğini içerir Await , ancak ifadelerin yokluğu Await bir derleyici hatasına neden olmaz. Zaman uyumsuz bir yöntem, askıya alma Await noktasını işaretlemek için bir operatör kullanmıyorsa Yöntem, değiştiriciye rağmen zaman uyumlu bir yöntem olarak yürütülür Async . Derleyici bu tür yöntemler için bir uyarı verir.
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 programlamada, zaman uyumsuz bir yöntem genellikle bir Task veya bir görevi (tresult)döndürür. Zaman uyumsuz bir yöntemde, bir Await işleç, başka bir zaman uyumsuz metoda yapılan çağrıdan döndürülen bir göreve uygulanır.
Yöntemi, türü bir işleneni belirten Return ifadesini içeriyorsa, dönüş türü olarak (TResult) görevi belirtirsiniz TResult .
TaskMetodun Return ifadesine sahip olmaması veya bir işleneni döndürmeyen bir return ifadesine sahip olması durumunda dönüş türü olarak kullanırsınız.
Aşağıdaki örnek, bir görevi (TResult) veya şunu döndüren bir yöntemi bildirme ve çağırma şeklini gösterir Task :
' 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ülmüş her görev, devam eden bir çalışmayı temsil eder. Bir görev, zaman uyumsuz işlemin durumu hakkındaki bilgileri saklar ve sonunda, işlemden alınan nihai sonuca veya başarısız olursa işlemin neden olduğu bir özel duruma ilişkin bilgileri içerir.
Zaman uyumsuz 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ı olarak hizmet eder.
Bir yordam olan zaman uyumsuz bir yöntem beklenemez Sub ve çağıran, yöntemin aldığı özel durumları yakalayamaz.
Zaman uyumsuz bir yöntem ByRef parametreleri bildiremez, ancak yöntem bu parametrelere sahip yöntemleri çağırabilir.
Daha fazla bilgi ve örnek için bkz. Async Return Types (Visual Basic). Zaman uyumsuz yöntemlerde özel durumları yakalama hakkında daha fazla bilgi için bkz . TRY... Yakala... Finally ekstresi.
Windows Çalışma Zamanı programlamadaki zaman uyumsuz apı 'ler, görevlerle benzer olan aşağıdaki dönüş türlerinden birine sahiptir:
- IAsyncOperation (Of TResult), göreve (Of TResult) karşılık gelir
- IAsyncActionöğesine karşılık gelen Task
- IAsyncActionWithProgress (Of TProgress)
- IAsyncOperationWithProgress (Of TResult, TProgress)
Daha fazla bilgi ve örnek için bkz. C# veya Visual Basic zaman uyumsuz API 'Leri çağırma.
Adlandırma kuralı
Kurala göre, değiştiriciye sahip yöntemlerin adlarına "Async" ekleyin Async .
Bir olay, taban sınıf veya arabirim sözleşmesi farklı bir ad öneriyorsa kuralı yoksayabilirsiniz. Örneğin, gibi yaygın olay işleyicilerini yeniden adlandırmamanız gerekir Button1_Click .
İ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 bir WPF çözümünü zaman uyumsuz bir WPF çözümüne nasıl dönüştüreceğinizi gösterir. Uygulama bir dizi web sitesi indirir. | Zaman uyumsuz örnek: Async ve await ile zaman uyumsuz programlama (Visual Basic) |
| Nasıl yapılır: Task. WhenAll kullanarak zaman uyumsuz Izlenecek yolu genişletme (Visual Basic) | Task.WhenAllÖnceki izlenecek yolu ekler. Öğesinin kullanımı, WhenAll tüm indirmeleri aynı anda başlatır. |
|
| Nasıl yapılır: Async ve await kullanarak birden çok Web Isteğini paralel hale getirme (Visual Basic) | Nasıl aynı anda birkaç görevi başlatacağınızı gösterir. | Zaman uyumsuz örnek: birden çok Web Isteğini paralel hale getirme |
| Zaman uyumsuz dönüş türleri (Visual Basic) | Zaman uyumsuz yöntemlerin döndürebileceği türleri gösterir ve her türün ne zaman uygun olduğunu açıklar. | |
| zaman uyumsuz programlarda denetim Flow (Visual Basic) | Ayrıntılı olarak birbirini izleyenler aracılığıyla denetim akışını izler ve zaman uyumsuz bir program ifadesi bekler. | async örneği: zaman uyumsuz programlarda denetim Flow |
| Zaman uyumsuz uygulamanızda ince ayar yapma (Visual Basic) | Zaman uyumsuz çözümünüze aşağıdaki işlevin nasıl ekleneceğini gösterir: - Zaman uyumsuz bir görevi veya görev listesini iptal etme (Visual Basic) - Zaman uyumsuz görevleri bir süre sonra iptal et (Visual Basic) - Kalan zaman uyumsuz görevleri bir süre tamamlandıktan sonra iptal et (Visual Basic) - Birden çok zaman uyumsuz görev başlatın ve bunları tamamlarsa Işleyin (Visual Basic) |
Zaman uyumsuz örnek: uygulamanıza Ince ayar yapma |
| Zaman uyumsuz uygulamalarda yeniden girişi işleme (Visual Basic) | Çalışırken etkin bir zaman uyumsuz işlemin yeniden başlatılma durumlarının nasıl işleneceğini gösterir. | |
| whenany: .NET Framework ve Windows Çalışma Zamanı arasında köprü oluşturma | bir Windows Çalışma Zamanı yöntemiyle kullanabilmeniz için, Windows Çalışma Zamanı .NET Framework ve ıasyncoperations içindeki görev türleri arasında nasıl köprü oluşturulacağını gösterir WhenAny . | zaman uyumsuz örnek: .net ile Windows Çalışma Zamanı arasında köprü oluşturma (astask ve whenany) |
| Zaman Uyumsuz İptal: .NET Framework ve Windows Çalışma Zamanı arasında köprü oluşturma | bir Windows Çalışma Zamanı yöntemiyle kullanabilmeniz için, Windows Çalışma Zamanı .NET Framework ve ıasyncoperations içindeki görev türleri arasında nasıl köprü oluşturulacağını gösterir CancellationTokenSource . | zaman uyumsuz örnek: .net ve Windows Çalışma Zamanı arasında köprü oluşturma (astask & iptali) |
| Dosya erişimi için Async Kullanma (Visual Basic) | Dosyalara erişmek için zaman uyumsuz yöntemin ve await işlecinin kullanılmasına ilişkin avantajları listeler ve gösterir. | |
| Görev Tabanlı Zaman Uyumsuz Desen (TAP) | .NET Framework'te zaman uyumsuzluk için yeni bir düzen açıklar. Bu model, Task ve görev (Of TResult) türlerini temel alır. | |
| Channel 9 ' da zaman uyumsuz videolar | Zaman uyumsuz programlama hakkında çeşitli videoların bağlantılarını sağlar. |
Örnek Tamam
aşağıdaki kod, bu konunun ele aldığı Windows Presentation Foundation (WPF) uygulamasındaki MainWindow. xaml. vb dosyasıdır. Örneği zaman uyumsuz örnek: "Async ve await Ile zaman uyumsuz programlama" kaynağındanindirebilirsiniz.
Imports System.Net.Http
' Example that demonstrates Asynchronous Progamming 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://docs.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