Zaman Uyumsuz Dönüş Türleri (Visual Basic)

Zaman uyumsuz yöntemlerin üç olası dönüş türü vardır: Task<TResult>, Taskve void. Visual Basic'te void dönüş türü Bir Alt yordam olarak yazılır. Zaman uyumsuz yöntemler hakkında daha fazla bilgi için bkz . Async ve Await (Visual Basic) ile Zaman Uyumsuz Programlama.

Her dönüş türü aşağıdaki bölümlerden birinde incelenmiştir ve konunun sonunda üç türün de kullanıldığı tam bir örnek bulabilirsiniz.

Not

Ö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.

Görev(T) Dönüş Türü

Task<TResult> dönüş türü, işlenenin türüne TResultsahip olduğu return deyimini içeren zaman uyumsuz bir yöntem için kullanılır.

Aşağıdaki örnekte, TaskOfT_MethodAsync zaman uyumsuz yöntem tamsayı döndüren bir dönüş deyimi içerir. Bu nedenle, yöntem bildiriminin dönüş türünü belirtmesi Task(Of Integer)gerekir.

' TASK(OF T) EXAMPLE
Async Function TaskOfT_MethodAsync() As Task(Of Integer)

    ' The body of an async method is expected to contain an awaited
    ' asynchronous call.
    ' Task.FromResult is a placeholder for actual work that returns a string.
    Dim today As String = Await Task.FromResult(Of String)(DateTime.Now.DayOfWeek.ToString())

    ' The method then can process the result in some way.
    Dim leisureHours As Integer
    If today.First() = "S" Then
        leisureHours = 16
    Else
        leisureHours = 5
    End If

    ' Because the return statement specifies an operand of type Integer, the
    ' method must have a return type of Task(Of Integer).
    Return leisureHours
End Function

Await ifadesi içinden çağrıldığındaTaskOfT_MethodAsync, await ifadesi tarafından TaskOfT_MethodAsyncdöndürülen görevde depolanan tamsayı değerini (değerileisureHours) alır. await ifadeleri hakkında daha fazla bilgi için bkz . Await İşleci.

Aşağıdaki kod yöntemini çağırır ve bekler TaskOfT_MethodAsync. Sonuç değişkene result1 atanır.

' Call and await the Task(Of T)-returning async method in the same statement.
Dim result1 As Integer = Await TaskOfT_MethodAsync()

Aşağıdaki kodda gösterildiği gibi çağrısı TaskOfT_MethodAsync uygulamasını uygulamasından Awaitayırarak bunun nasıl gerçekleştiğini daha iyi anlayabilirsiniz. Hemen beklenmeyen bir yöntem TaskOfT_MethodAsync çağrısı, yönteminin bildiriminden bekleyebileceğiniz gibi bir Task(Of Integer)döndürür. Görev örnekteki integerTask değişkene atanır. bir integerTask olduğundanTask<TResult>, türünde TResultbir Result özellik içerir. Bu durumda, TResult bir tamsayı türünü temsil eder. Await öğesine uygulandığında integerTaskawait ifadesi özelliğinin ResultintegerTaskiçeriğini değerlendirir. Değer değişkenine result2 atanır.

Uyarı

Result özelliği bir engelleme özelliğidir. Görevi tamamlanmadan önce erişmeye çalışırsanız, o anda etkin olan iş parçacığı görev tamamlanana ve değer kullanılabilir olana kadar engellenir. Çoğu durumda, özelliğine doğrudan erişmek yerine kullanarak Await değerine erişmeniz gerekir.

' Call and await in separate statements.
Dim integerTask As Task(Of Integer) = TaskOfT_MethodAsync()

' You can do other work that does not rely on resultTask before awaiting.
textBox1.Text &= "Application can continue working while the Task(Of T) runs. . . . " & vbCrLf

Dim result2 As Integer = Await integerTask

Aşağıdaki koddaki display deyimleri değişkenin, değişkenin ve özelliğin result1result2 değerlerinin Result aynı olduğunu doğrular. Özelliğin Result bir engelleme özelliği olduğunu ve görevi beklenmeden önce erişilmemesi gerektiğini unutmayın.

' Display the values of the result1 variable, the result2 variable, and
' the resultTask.Result property.
textBox1.Text &= vbCrLf & $"Value of result1 variable:   {result1}" & vbCrLf
textBox1.Text &= $"Value of result2 variable:   {result2}" & vbCrLf
textBox1.Text &= $"Value of resultTask.Result:  {integerTask.Result}" & vbCrLf

Görev Dönüş Türü

Dönüş deyimi içermeyen veya işlenen döndürmeyen bir return deyimi içeren zaman uyumsuz yöntemler genellikle dönüş türüne Tasksahiptir. Bu tür yöntemler, zaman uyumlu olarak çalışacak şekilde yazıldıysa Alt yordamlar olabilir. Zaman uyumsuz bir Task yöntem için dönüş türü kullanırsanız, çağıran yöntem çağrılan zaman uyumsuz yöntem tamamlanana kadar çağıranın tamamlanmasını askıya almak için bir Await işleç kullanabilir.

Aşağıdaki örnekte, async yöntemi Task_MethodAsync return deyimi içermiyor. Bu nedenle, yöntemi için bir dönüş türü Task belirtirsiniz ve bu Task_MethodAsync da beklenebilir. Türün Task tanımı, dönüş değerini depolamak için bir Result özellik içermez.

' TASK EXAMPLE
Async Function Task_MethodAsync() As Task

    ' The body of an async method is expected to contain an awaited
    ' asynchronous call.
    ' Task.Delay is a placeholder for actual work.
    Await Task.Delay(2000)
    textBox1.Text &= vbCrLf & "Sorry for the delay. . . ." & vbCrLf

    ' This method has no return statement, so its return type is Task.
End Function

Task_MethodAsync çağrılır ve zaman uyumlu Sub veya void-dönüş yöntemi için çağıran deyimine benzer bir await ifadesi yerine await deyimi kullanılarak beklenir. Bu durumda bir Await işlecin uygulanması bir değer üretmez.

Aşağıdaki kod yöntemini çağırır ve bekler Task_MethodAsync.

' Call and await the Task-returning async method in the same statement.
Await Task_MethodAsync()

Önceki Task<TResult> örnekte olduğu gibi, aşağıdaki kodda gösterildiği gibi çağrısı Task_MethodAsync bir işlecin uygulamasından Await ayırabilirsiniz. Ancak, bir Task özelliği olmadığını Result ve bir await işleci bir uygulandığında Taskhiçbir değer üretilmez unutmayın.

Aşağıdaki kod, çağrıyı Task_MethodAsync döndüren Task_MethodAsync görevi beklemeden ayırır.

' Call and await in separate statements.
Dim simpleTask As Task = Task_MethodAsync()

' You can do other work that does not rely on simpleTask before awaiting.
textBox1.Text &= vbCrLf & "Application can continue working while the Task runs. . . ." & vbCrLf

Await simpleTask

Geçersiz Dönüş Türü

Yordamların Sub birincil kullanımı, dönüş türünün olmadığı olay işleyicilerindedir (diğer dillerde geçersiz dönüş türü olarak adlandırılır). Void dönüş, void-return yöntemlerini geçersiz kılmak veya "yangın ve unutma" olarak kategorilere ayırabilecek etkinlikler gerçekleştiren yöntemler için de kullanılabilir. Ancak, boşluk döndüren bir zaman uyumsuz yöntem beklenemediği için mümkün olduğunca bir döndürmelisiniz Task . Böyle bir yöntemin çağıranın, çağrılan zaman uyumsuz yöntemin bitmesi beklenmeden tamamlanmaya devam edebilmesi ve çağıranın zaman uyumsuz yöntemin oluşturduğu değerlerden veya özel durumlardan bağımsız olması gerekir.

Void döndüren bir zaman uyumsuz yöntemi çağıran yöntemden oluşan özel durumları yakalayamaz ve bu tür işlenmeyen özel durumlar uygulamanızın başarısız olmasına neden olabilir. veya Task<TResult>döndüren Task zaman uyumsuz bir yöntemde özel durum oluşursa, özel durum döndürülen görevde depolanır ve görev beklendiğinde yeniden oluşturulur. Bu nedenle, özel durum oluşturabilen herhangi bir zaman uyumsuz yöntemin TaskTask<TResult> veya dönüş türüne sahip olduğundan ve yöntemine yapılan çağrıların beklendiğinden emin olun.

Zaman uyumsuz yöntemlerdeki özel durumları yakalama hakkında daha fazla bilgi için bkz . Try... Yakalamak... Finally Deyimi.

Aşağıdaki kod zaman uyumsuz bir olay işleyicisi tanımlar.

' SUB EXAMPLE
Async Sub button1_Click(sender As Object, e As RoutedEventArgs) Handles button1.Click

    textBox1.Clear()

    ' Start the process and await its completion. DriverAsync is a
    ' Task-returning async method.
    Await DriverAsync()

    ' Say goodbye.
    textBox1.Text &= vbCrLf & "All done, exiting button-click event handler."
End Sub

Tam Örnek

Aşağıdaki Windows Presentation Foundation (WPF) projesi bu konudaki kod örneklerini içerir.

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

  1. Visual Studio’yu çalıştırın.

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

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

  3. Yüklü Şablonlarkategorisinde Visual Basic'i ve ardından Windows'u seçin. Proje türleri listesinden WPF Uygulaması'nı seçin.

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

    Yeni proje Çözüm Gezgini görüntülenir.

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

    Sekme görünmüyorsa, Çözüm Gezgini'de MainWindow.xaml kısayol menüsünü açın ve aç'ı seçin.

  6. MainWindow.xaml dosyasının XAML penceresinde kodu aşağıdaki kodla değiştirin.

    <Window x:Class="MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button x:Name="button1" Content="Start" HorizontalAlignment="Left" Margin="214,28,0,0" VerticalAlignment="Top" Width="75" HorizontalContentAlignment="Center" FontWeight="Bold" FontFamily="Aharoni" Click="button1_Click"/>
            <TextBox x:Name="textBox1" Margin="0,80,0,0" TextWrapping="Wrap" FontFamily="Lucida Console"/>
    
        </Grid>
    </Window>
    

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

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

  8. MainWindow.xaml.vb içindeki kodu aşağıdaki kodla değiştirin.

    Class MainWindow
    
        ' SUB EXAMPLE
        Async Sub button1_Click(sender As Object, e As RoutedEventArgs) Handles button1.Click
    
            textBox1.Clear()
    
            ' Start the process and await its completion. DriverAsync is a
            ' Task-returning async method.
            Await DriverAsync()
    
            ' Say goodbye.
            textBox1.Text &= vbCrLf & "All done, exiting button-click event handler."
        End Sub
    
        Async Function DriverAsync() As Task
    
            ' Task(Of T)
            ' Call and await the Task(Of T)-returning async method in the same statement.
            Dim result1 As Integer = Await TaskOfT_MethodAsync()
    
            ' Call and await in separate statements.
            Dim integerTask As Task(Of Integer) = TaskOfT_MethodAsync()
    
            ' You can do other work that does not rely on resultTask before awaiting.
            textBox1.Text &= "Application can continue working while the Task(Of T) runs. . . . " & vbCrLf
    
            Dim result2 As Integer = Await integerTask
    
            ' Display the values of the result1 variable, the result2 variable, and
            ' the resultTask.Result property.
            textBox1.Text &= vbCrLf & $"Value of result1 variable:   {result1}" & vbCrLf
            textBox1.Text &= $"Value of result2 variable:   {result2}" & vbCrLf
            textBox1.Text &= $"Value of resultTask.Result:  {integerTask.Result}" & vbCrLf
    
            ' Task
            ' Call and await the Task-returning async method in the same statement.
            Await Task_MethodAsync()
    
            ' Call and await in separate statements.
            Dim simpleTask As Task = Task_MethodAsync()
    
            ' You can do other work that does not rely on simpleTask before awaiting.
            textBox1.Text &= vbCrLf & "Application can continue working while the Task runs. . . ." & vbCrLf
    
            Await simpleTask
        End Function
    
        ' TASK(OF T) EXAMPLE
        Async Function TaskOfT_MethodAsync() As Task(Of Integer)
    
            ' The body of an async method is expected to contain an awaited
            ' asynchronous call.
            ' Task.FromResult is a placeholder for actual work that returns a string.
            Dim today As String = Await Task.FromResult(Of String)(DateTime.Now.DayOfWeek.ToString())
    
            ' The method then can process the result in some way.
            Dim leisureHours As Integer
            If today.First() = "S" Then
                leisureHours = 16
            Else
                leisureHours = 5
            End If
    
            ' Because the return statement specifies an operand of type Integer, the
            ' method must have a return type of Task(Of Integer).
            Return leisureHours
        End Function
    
        ' TASK EXAMPLE
        Async Function Task_MethodAsync() As Task
    
            ' The body of an async method is expected to contain an awaited
            ' asynchronous call.
            ' Task.Delay is a placeholder for actual work.
            Await Task.Delay(2000)
            textBox1.Text &= vbCrLf & "Sorry for the delay. . . ." & vbCrLf
    
            ' This method has no return statement, so its return type is Task.
        End Function
    
    End Class
    
  9. 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:

    Application can continue working while the Task<T> runs. . . .
    
    Value of result1 variable:   5
    Value of result2 variable:   5
    Value of integerTask.Result: 5
    
    Sorry for the delay. . . .
    
    Application can continue working while the Task runs. . . .
    
    Sorry for the delay. . . .
    
    All done, exiting button-click event handler.
    

Ayrıca bkz.