Aracılığıyla paylaş


Asenkron Programlara Kontrol Akışı (Visual Basic)

Async ve Await anahtar sözcüklerini kullanarak zaman uyumsuz programları daha kolay yazabilir ve koruyabilirsiniz. Ancak, programınızın nasıl çalıştığını anlamıyorsanız sonuçlar sizi şaşırtabilir. Bu konu, denetim bir yöntemden diğerine geçtiğinde ve her seferinde hangi bilgilerin aktarıldığını göstermek için basit bir eşzamansız programda denetim akışını izler.

Uyarı

Async ve Await anahtar sözcükleri Visual Studio 2012'de kullanıma sunulmuştur.

Genel olarak, zaman uyumsuz kod içeren yöntemleri Zaman Uyumsuz değiştirici ile işaretlersiniz. Zaman uyumsuz değiştiriciyle işaretlenmiş bir yöntemde, yöntemin zaman uyumsuz olarak adlandırılan işlemin tamamlanmasını bekleyeceği yeri belirtmek için Await (Visual Basic) işlecini kullanabilirsiniz. Daha fazla bilgi için bkz. Async ve Await (Visual Basic) ile Zaman Uyumsuz Programlama.

Aşağıdaki örnek, belirtilen web sitesinin içeriğini dize olarak indirmek ve dizenin uzunluğunu görüntülemek için zaman uyumsuz yöntemler kullanır. Örnek aşağıdaki iki yöntemi içerir.

  • startButton_Click öğesini çağırarak AccessTheWebAsync sonucu görüntüler.

  • AccessTheWebAsync, bir web sitesinin içeriğini dize olarak indirir ve dizenin uzunluğunu döndürür. AccessTheWebAsync , içeriğini indirmek için zaman uyumsuz HttpClient bir yöntemi GetStringAsync(String)kullanır.

Numaralandırılmış görüntüleme satırları, programın nasıl çalıştığını anlamanıza ve işaretlenen her noktada ne olduğunu açıklamanıza yardımcı olmak için program genelinde stratejik noktalarda görünür. Görüntü satırları "BİR" ile "ALTI" arasında etiketlenir. Etiketler, programın bu kod satırlarına ulaşma sırasını temsil eder.

Aşağıdaki kodda programın ana hattı gösterilmektedir.

Class MainWindow

    Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs) Handles StartButton.Click

        ' ONE
        Dim getLengthTask As Task(Of Integer) = AccessTheWebAsync()

        ' FOUR
        Dim contentLength As Integer = Await getLengthTask

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

    End Sub

    Async Function AccessTheWebAsync() As Task(Of Integer)

        ' TWO
        Dim client As HttpClient = New HttpClient()
        Dim getStringTask As Task(Of String) =
            client.GetStringAsync("https://learn.microsoft.com")

        ' THREE
        Dim urlContents As String = Await getStringTask

        ' FIVE
        Return urlContents.Length
    End Function

End Class

Etiketlenmiş konumların her biri, "BİR"den "ALTI"ya kadar programın mevcut durumu hakkındaki bilgileri görüntüler. Aşağıdaki sonuç üretilir:

ONE:   Entering startButton_Click.
           Calling AccessTheWebAsync.

TWO:   Entering AccessTheWebAsync.
           Calling HttpClient.GetStringAsync.

THREE: Back in AccessTheWebAsync.
           Task getStringTask is started.
           About to await getStringTask & return a Task<int> to startButton_Click.

FOUR:  Back in startButton_Click.
           Task getLengthTask is started.
           About to await getLengthTask -- no caller to return to.

FIVE:  Back in AccessTheWebAsync.
           Task getStringTask is complete.
           Processing the return statement.
           Exiting from AccessTheWebAsync.

SIX:   Back in startButton_Click.
           Task getLengthTask is finished.
           Result from AccessTheWebAsync is stored in contentLength.
           About to display contentLength and exit.

Length of the downloaded string: 33946.

Programı Ayarlama

Bu konunun kullandığı kodu MSDN'den indirebilir veya kendiniz oluşturabilirsiniz.

Uyarı

Örneği çalıştırmak için bilgisayarınızda Visual Studio 2012 veya üzeri ve .NET Framework 4.5 veya daha yeni bir sürümü yüklü olmalıdır.

Programı indirin

Bu konu için uygulamayı Asenkron Örnek: Asenkron Programlarda Kontrol Akışı indirip kullanabilirsiniz. Aşağıdaki adımlar programı açar ve çalıştırır.

  1. İndirilen dosyanın sıkıştırmasını açın ve Visual Studio'yu başlatın.

  2. Menü çubuğunda Dosya, , Proje/Çözüm'e tıklayın.

  3. Sıkıştırması açılmış örnek kodun bulunduğu klasöre gidin, çözüm (.sln) dosyasını açın ve projeyi derlemek ve çalıştırmak için F5 anahtarını seçin.

Programı Kendiniz Oluşturun

Aşağıdaki Windows Presentation Foundation (WPF) projesi bu konu için kod örneğini içerir.

Projeyi çalıştırmak için aşağıdaki adımları uygulayın:

  1. Visual Studio'yu başlatın.

  2. Menü çubuğunda Dosya, Yeni, Proje'yi seçin.

    Yeni Proje iletişim kutusu açılır.

  3. Yüklü Şablonlar bölmesinde Visual Basic'i ve ardından proje türleri listesinden WPF Uygulaması'nı seçin.

  4. Projenin adı olarak girin AsyncTracer ve tamam düğmesini seçin.

    Yeni proje Çözüm Gezgini'nde görünür.

  5. Visual Studio Code Düzenleyicisi'nde MainWindow.xaml sekmesini seçin.

    Sekme görünmüyorsa, Çözüm Gezgini'nde MainWindow.xaml kısayol menüsünü açın ve Kodu Görüntüle'yi seçin.

  6. MainWindow.xaml dosyasının XAML görünümünde kodu aşağıdaki kodla değiştirin.

    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="MainWindow"
        Title="Control Flow Trace" Height="350" Width="525">
        <Grid>
            <Button x:Name="StartButton" Content="Start" HorizontalAlignment="Left" Margin="221,10,0,0" VerticalAlignment="Top" Width="75"/>
            <TextBox x:Name="ResultsTextBox" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Bottom" Width="510" Height="265" FontFamily="Lucida Console" FontSize="10" VerticalScrollBarVisibility="Visible" d:LayoutOverrides="HorizontalMargin"/>
    
        </Grid>
    </Window>
    

    MainWindow.xaml dosyasının Tasarım görünümünde metin kutusu ve düğme içeren basit bir pencere görüntülenir.

  7. System.Net.Http için bir referans ekleyin.

  8. Çözüm Gezgini'nde MainWindow.xaml.vb kısayol menüsünü açın ve kodu görüntüle'yi seçin.

  9. MainWindow.xaml.vb içinde kodu aşağıdaki kodla değiştirin.

    ' Add an Imports statement and a reference for System.Net.Http.
    Imports System.Net.Http
    
    Class MainWindow
    
        Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs) Handles StartButton.Click
    
            ' The display lines in the example lead you through the control shifts.
            ResultsTextBox.Text &= "ONE:   Entering StartButton_Click." & vbCrLf &
                "           Calling AccessTheWebAsync." & vbCrLf
    
            Dim getLengthTask As Task(Of Integer) = AccessTheWebAsync()
    
            ResultsTextBox.Text &= vbCrLf & "FOUR:  Back in StartButton_Click." & vbCrLf &
                "           Task getLengthTask is started." & vbCrLf &
                "           About to await getLengthTask -- no caller to return to." & vbCrLf
    
            Dim contentLength As Integer = Await getLengthTask
    
            ResultsTextBox.Text &= vbCrLf & "SIX:   Back in StartButton_Click." & vbCrLf &
                "           Task getLengthTask is finished." & vbCrLf &
                "           Result from AccessTheWebAsync is stored in contentLength." & vbCrLf &
                "           About to display contentLength and exit." & vbCrLf
    
            ResultsTextBox.Text &=
                String.Format(vbCrLf & "Length of the downloaded string: {0}." & vbCrLf, contentLength)
        End Sub
    
        Async Function AccessTheWebAsync() As Task(Of Integer)
    
            ResultsTextBox.Text &= vbCrLf & "TWO:   Entering AccessTheWebAsync."
    
            ' Declare an HttpClient object.
            Dim client As HttpClient = New HttpClient()
    
            ResultsTextBox.Text &= vbCrLf & "           Calling HttpClient.GetStringAsync." & vbCrLf
    
            ' GetStringAsync returns a Task(Of String).
            Dim getStringTask As Task(Of String) = client.GetStringAsync("https://learn.microsoft.com")
    
            ResultsTextBox.Text &= vbCrLf & "THREE: Back in AccessTheWebAsync." & vbCrLf &
                "           Task getStringTask is started."
    
            ' AccessTheWebAsync can continue to work until getStringTask is awaited.
    
            ResultsTextBox.Text &=
                vbCrLf & "           About to await getStringTask & return a Task(Of Integer) to StartButton_Click." & vbCrLf
    
            ' Retrieve the website contents when task is complete.
            Dim urlContents As String = Await getStringTask
    
            ResultsTextBox.Text &= vbCrLf & "FIVE:  Back in AccessTheWebAsync." &
                vbCrLf & "           Task getStringTask is complete." &
                vbCrLf & "           Processing the return statement." &
                vbCrLf & "           Exiting from AccessTheWebAsync." & vbCrLf
    
            Return urlContents.Length
        End Function
    
    End Class
    
  10. Programı çalıştırmak için F5 tuşunu seçin ve ardından Başlat düğmesini seçin.

    Aşağıdaki çıkış görünmelidir:

    ONE:   Entering startButton_Click.
               Calling AccessTheWebAsync.
    
    TWO:   Entering AccessTheWebAsync.
               Calling HttpClient.GetStringAsync.
    
    THREE: Back in AccessTheWebAsync.
               Task getStringTask is started.
               About to await getStringTask & return a Task<int> to startButton_Click.
    
    FOUR:  Back in startButton_Click.
               Task getLengthTask is started.
               About to await getLengthTask -- no caller to return to.
    
    FIVE:  Back in AccessTheWebAsync.
               Task getStringTask is complete.
               Processing the return statement.
               Exiting from AccessTheWebAsync.
    
    SIX:   Back in startButton_Click.
               Task getLengthTask is finished.
               Result from AccessTheWebAsync is stored in contentLength.
               About to display contentLength and exit.
    
    Length of the downloaded string: 33946.
    

Programı İzleme

1. ve 2. Adımlar

İlk iki görüntüleme satırı, startButton_Click'nin AccessTheWebAsync'yi çağırırken izlediği yolu ve AccessTheWebAsync'nin zaman uyumsuz HttpClient yöntemini GetStringAsync(String) ile çağırmasını izler. Aşağıdaki görüntüde yöntemden yönteme çağrılar özetlenmiştir.

Adımlar BİR ve İKİ

AccessTheWebAsync ve client.GetStringAsync için dönüş türü Task<TResult>'dir. için AccessTheWebAsync, TResult bir tamsayıdır. GetStringAsync için, TResult bir string ifadesidir. Zaman uyumsuz yöntem dönüş türleri hakkında daha fazla bilgi için bkz. Zaman Uyumsuz Dönüş Türleri (Visual Basic).

Görev döndüren bir zaman uyumsuz yöntem, çağırana denetim geri döndüğünde bir görev örneği döndürür. Denetim, çağrılan yöntemde bir işleçle karşılaşıldığında veya çağrılan yöntem sona erdiğinde zaman uyumsuz bir Await yöntemden çağırana döndürür. "ÜÇ"ten "ALTI"ya kadar etiketlenen görüntüleme hatları, işlemin bu bölümünü izler.

ÜÇ. Adım

AccessTheWebAsync içinde, hedef web sayfasının içeriğini indirmek için asenkron yöntem GetStringAsync(String) kullanılır. Denetim, client.GetStringAsync döndüğünde AccessTheWebAsync'dan client.GetStringAsync'e geri döner.

client.GetStringAsync yöntemi, getStringTask'ye atanan bir dize görevi döndürür ve bu görev AccessTheWebAsync değişkenine atanır. Örnek programdaki aşağıdaki satır, client.GetStringAsync çağrısını ve atamayı gösterir.

Dim getStringTask As Task(Of String) = client.GetStringAsync("https://learn.microsoft.com")

Gerçek bir dizeyi sonunda oluşturmak için client.GetStringAsync tarafından verilen bir vaat olarak görevi düşünebilirsiniz. Bu arada, AccessTheWebAsync'un söz verilen dizeye client.GetStringAsync bağlı olmadan yapabileceği işler varsa, bu işlemler client.GetStringAsync beklerken devam edebilir. Örnekte, "ÜÇ" etiketli aşağıdaki çıkış satırları, bağımsız çalışma yapma fırsatını temsil eder

THREE: Back in AccessTheWebAsync.
           Task getStringTask is started.
           About to await getStringTask & return a Task<int> to startButton_Click.

Aşağıdaki deyim, AccessTheWebAsync beklendiğinde getStringTask içindeki ilerlemeyi askıya alır.

Dim urlContents As String = Await getStringTask

Aşağıdaki görüntüde, client.GetStringAsync'den getStringTask'e atamaya ve getStringTask'nin oluşturulmasından Await işlecinin uygulanmasına kadar olan denetim akışı gösterilmektedir.

Üç. Adım

Await ifadesi, AccessTheWebAsync dönene kadar client.GetStringAsync askıya alır. Bu arada, denetim öğesini çağırana AccessTheWebAsyncstartButton_Clickgeri döner.

Uyarı

Genellikle, zaman uyumsuz bir yönteme çağrıyı hemen beklersiniz. Örneğin, aşağıdaki atama, getStringTask oluşturan ve ardından bekleyen önceki kodun yerine kullanılabilir: Dim urlContents As String = Await client.GetStringAsync("https://learn.microsoft.com")

Bu konuda, await işleci, programın denetim akışını gösteren çıktı satırlarını uygun hale getirmek için sonrasında uygulanır.

DÖRDÜNCÜ Adım

bildirilen dönüş türü AccessTheWebAsync : Task(Of Integer). Bu nedenle, AccessTheWebAsync askıya alındığında, startButton_Click'e bir tamsayı görevi döndürür. Döndürülen görevin olmadığını getStringTaskanlamalısınız. Döndürülen görev, askıya alınan yönteminde AccessTheWebAsyncyapılması gerekenleri temsil eden yeni bir tamsayı görevidir. Görev tamamlandığında bir tamsayı üretme sözü AccessTheWebAsync 'den gelmektedir.

Aşağıdaki deyim bu görevi değişkenine getLengthTask atar.

Dim getLengthTask As Task(Of Integer) = AccessTheWebAsync()

İçinde AccessTheWebAsync olduğu gibi, startButton_Click, görev bekleninceye kadar zaman uyumsuz görevin (getLengthTask) sonuçlarına bağlı olmayan çalışmaya devam edebilir. Aşağıdaki çıkış satırları bu çalışmayı temsil ediyor:

FOUR:  Back in startButton_Click.
           Task getLengthTask is started.
           About to await getLengthTask -- no caller to return to.

startButton_Click işlemi, getLengthTask beklendiğinde askıya alınır. Aşağıdaki atama deyimi startButton_Click ifadesini, AccessTheWebAsync tamamlanana kadar askıya alır.

Dim contentLength As Integer = Await getLengthTask

Aşağıdaki çizimde, oklar AccessTheWebAsync içindeki await ifadesinden getLengthTask'e bir değerin atanmasına ve ardından startButton_Click beklenene kadar getLengthTask içinde normal işlemenin devam etmesine kadar denetim akışını gösterir.

Adım Dört

BEŞ. Adım

Ne zaman tamamlandığı sinyalleri client.GetStringAsync tarafından verildiğinde, AccessTheWebAsync içindeki işlem askıdan çıkarılarak serbest bırakılır ve await ifadesinin ötesinde devam edebilir. Aşağıdaki çıkış satırları işlemenin yeniden başlatılmasını temsil ediyor:

FIVE:  Back in AccessTheWebAsync.
           Task getStringTask is complete.
           Processing the return statement.
           Exiting from AccessTheWebAsync.

return deyiminin işleneni, urlContents.Length'in döndürdüğü görevde AccessTheWebAsync olarak depolanır. await ifadesi, getLengthTask içindeki startButton_Click'den bu değeri alır.

Aşağıdaki görüntüde client.GetStringAsync (ve getStringTask) tamamlandıktan sonra denetimin aktarımı gösterilmektedir.

Beş. Adım

AccessTheWebAsync tamamlanana kadar çalışır ve kontrolün beklemekte olduğu startButton_Click'e döner.

ALTINCI Adım

İşlemin tamamlandığının sinyallerini aldığınızda AccessTheWebAsync işleme, içindeki startButton_Asyncawait deyiminden sonra da devam edebilir. Aslında, programın yapacak başka bir şeyi yok.

Aşağıdaki çıkış satırları, içindeki startButton_Asyncişlemenin yeniden başlatılmasını temsil ediyor:

SIX:   Back in startButton_Click.
           Task getLengthTask is finished.
           Result from AccessTheWebAsync is stored in contentLength.
           About to display contentLength and exit.

await ifadesi, getLengthTask içindeki AccessTheWebAsync return deyiminin işleneni olan tamsayı değeri alır. Aşağıdaki deyim bu değeri değişkene contentLength atar.

Dim contentLength As Integer = Await getLengthTask

Aşağıdaki görüntüde denetimin AccessTheWebAsync'dan startButton_Click'e döndüğü gösterilmektedir.

Altı. Adım

Ayrıca bakınız