BC42358: Karena panggilan ini tidak ditunggu, eksekusi metode saat ini berlanjut sebelum panggilan selesai

Karena panggilan ini tidak ditunggu, eksekusi metode saat ini berlanjut sebelum panggilan selesai. Pertimbangkan untuk menerapkan operator Await ke hasil panggilan.

Metode saat ini memanggil metode asinkron yang mengembalikan Task atau Task<TResult> dan tidak menerapkan operator Tunggu ke hasilnya. Panggilan ke metode asinkron memulai tugas asinkron. Namun, karena tidak ada operator Await yang diterapkan, program berlanjut tanpa menunggu tugas selesai. Dalam kebanyakan kasus, perilaku itu tidak diharapkan. Biasanya aspek lain dari metode panggilan bergantung pada hasil panggilan atau, minimal, metode yang disebut diharapkan selesai sebelum Anda kembali dari metode yang berisi panggilan.

Masalah yang sama pentingnya adalah apa yang terjadi dengan pengecualian yang dimunculkan dalam metode asinkron yang disebut. Pengecualian yang dimunculkan dalam metode yang mengembalikan Task atau Task<TResult> disimpan dalam tugas yang dikembalikan. Jika Anda tidak menunggu tugas atau secara eksplisit memeriksa pengecualian, pengecualian akan hilang. Jika Anda menunggu tugas, pengecualiannya dilemparkan kembali.

Sebagai praktik terbaik, Anda harus selalu menunggu panggilan.

Secara default, pesan ini adalah peringatan. Untuk informasi selengkapnya tentang menyembunyikan peringatan atau memperlakukan peringatan sebagai kesalahan, lihat Mengonfigurasi Peringatan di Visual Basic.

ID Kesalahan: BC42358

Untuk mengatasi peringatan ini

Anda harus mempertimbangkan untuk menekan peringatan hanya jika Anda yakin bahwa Anda tidak ingin menunggu panggilan asinkron selesai dan bahwa metode yang disebut tidak akan menimbulkan pengecualian. Dalam hal ini, Anda dapat menekan peringatan dengan menetapkan hasil tugas panggilan ke sebuah variabel.

Contoh berikut menunjukkan cara menyebabkan peringatan, cara menekannya, dan cara menunggu panggilan:

Async Function CallingMethodAsync() As Task

    ResultsTextBox.Text &= vbCrLf & "  Entering calling method."

    ' Variable delay is used to slow down the called method so that you
    ' can distinguish between awaiting and not awaiting in the program's output.
    ' You can adjust the value to produce the output that this topic shows
    ' after the code.
    Dim delay = 5000

    ' Call #1.
    ' Call an async method. Because you don't await it, its completion isn't
    ' coordinated with the current method, CallingMethodAsync.
    ' The following line causes the warning.
    CalledMethodAsync(delay)

    ' Call #2.
    ' To suppress the warning without awaiting, you can assign the
    ' returned task to a variable. The assignment doesn't change how
    ' the program runs. However, the recommended practice is always to
    ' await a call to an async method.
    ' Replace Call #1 with the following line.
    'Task delayTask = CalledMethodAsync(delay)

    ' Call #3
    ' To contrast with an awaited call, replace the unawaited call
    ' (Call #1 or Call #2) with the following awaited call. The best
    ' practice is to await the call.

    'Await CalledMethodAsync(delay)

    ' If the call to CalledMethodAsync isn't awaited, CallingMethodAsync
    ' continues to run and, in this example, finishes its work and returns
    ' to its caller.
    ResultsTextBox.Text &= vbCrLf & "  Returning from calling method."
End Function

Async Function CalledMethodAsync(howLong As Integer) As Task

    ResultsTextBox.Text &= vbCrLf & "    Entering called method, starting and awaiting Task.Delay."
    ' Slow the process down a little so you can distinguish between awaiting
    ' and not awaiting. Adjust the value for howLong if necessary.
    Await Task.Delay(howLong)
    ResultsTextBox.Text &= vbCrLf & "    Task.Delay is finished--returning from called method."
End Function

Dalam contoh, jika Anda memilih Panggilan #1 atau Panggilan #2, metode asinkron yang tidak ditunggu (CalledMethodAsync) selesai setelah pemanggilnya (CallingMethodAsync) dan pemanggil dari pemanggil (StartButton_Click) selesai. Baris terakhir dalam output berikut menunjukkan kepada Anda saat metode yang disebut selesai. Entri ke dan keluar dari penanganan aktivitas yang memanggil CallingMethodAsync dalam contoh lengkap ditandai dalam output.

Entering the Click event handler.
  Entering calling method.
    Entering called method, starting and awaiting Task.Delay.
  Returning from calling method.
Exiting the Click event handler.
    Task.Delay is finished--returning from called method.

Contoh

Aplikasi Windows Presentation Foundation (WPF) berikut ini berisi metode dari contoh sebelumnya. Gunakan langkah berikut untuk mengubah aplikasi:

  1. Buat aplikasi WPF, dan beri nama AsyncWarning.

  2. Di editor Visual Studio Code, pilih tab MainWindow.xaml.

    Jika tab tidak terlihat, buka menu pintasan untuk MainWindow.xaml di Penjelajah Solusi, lalu pilih Tampilkan Kode.

  3. Ganti kode dalam tampilan XAML MainWindow.xaml dengan kode berikut:

    <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="StartButton" Content="Start" HorizontalAlignment="Left" Margin="214,28,0,0" VerticalAlignment="Top" Width="75" HorizontalContentAlignment="Center" FontWeight="Bold" FontFamily="Aharoni" Click="StartButton_Click" />
            <TextBox x:Name="ResultsTextBox" Margin="0,80,0,0" TextWrapping="Wrap" FontFamily="Lucida Console"/>
        </Grid>
    </Window>
    

    Jendela sederhana yang berisi tombol dan kotak teks muncul dalam tampilan Desain MainWindow.xaml.

    Untuk informasi selengkapnya tentang Perancang XAML, lihat Membuat UI dengan menggunakan Perancang XAML. Untuk informasi tentang cara membangun UI sederhana sendiri, lihat bagian "Untuk membuat aplikasi WPF" dan "Untuk merancang WPF MainWindow sederhana" di Panduan: Mengakses Web dengan Menggunakan Asinkron dan Menunggu.

  4. Ganti kode di MainWindow.xaml.vb dengan kode berikut.

    Class MainWindow
    
        Private Async Sub StartButton_Click(sender As Object, e As RoutedEventArgs)
    
            ResultsTextBox.Text &= vbCrLf & "Entering the Click event handler."
            Await CallingMethodAsync()
            ResultsTextBox.Text &= vbCrLf & "Exiting the Click event handler."
        End Sub
    
        Async Function CallingMethodAsync() As Task
    
            ResultsTextBox.Text &= vbCrLf & "  Entering calling method."
    
            ' Variable delay is used to slow down the called method so that you
            ' can distinguish between awaiting and not awaiting in the program's output.
            ' You can adjust the value to produce the output that this topic shows
            ' after the code.
            Dim delay = 5000
    
            ' Call #1.
            ' Call an async method. Because you don't await it, its completion isn't
            ' coordinated with the current method, CallingMethodAsync.
            ' The following line causes the warning.
            CalledMethodAsync(delay)
    
            ' Call #2.
            ' To suppress the warning without awaiting, you can assign the
            ' returned task to a variable. The assignment doesn't change how
            ' the program runs. However, the recommended practice is always to
            ' await a call to an async method.
    
            ' Replace Call #1 with the following line.
            'Task delayTask = CalledMethodAsync(delay)
    
            ' Call #3
            ' To contrast with an awaited call, replace the unawaited call
            ' (Call #1 or Call #2) with the following awaited call. The best
            ' practice is to await the call.
    
            'Await CalledMethodAsync(delay)
    
            ' If the call to CalledMethodAsync isn't awaited, CallingMethodAsync
            ' continues to run and, in this example, finishes its work and returns
            ' to its caller.
            ResultsTextBox.Text &= vbCrLf & "  Returning from calling method."
        End Function
    
        Async Function CalledMethodAsync(howLong As Integer) As Task
    
            ResultsTextBox.Text &= vbCrLf & "    Entering called method, starting and awaiting Task.Delay."
            ' Slow the process down a little so you can distinguish between awaiting
            ' and not awaiting. Adjust the value for howLong if necessary.
            Await Task.Delay(howLong)
            ResultsTextBox.Text &= vbCrLf & "    Task.Delay is finished--returning from called method."
        End Function
    
    End Class
    
    ' Output
    
    ' Entering the Click event handler.
    '   Entering calling method.
    '     Entering called method, starting and awaiting Task.Delay.
    '   Returning from calling method.
    ' Exiting the Click event handler.
    '     Task.Delay is finished--returning from called method.
    
    ' Output
    
    ' Entering the Click event handler.
    '   Entering calling method.
    '     Entering called method, starting and awaiting Task.Delay.
    '     Task.Delay is finished--returning from called method.
    '   Returning from calling method.
    ' Exiting the Click event handler.
    
  5. Pilih tombol F5 untuk menjalankan program, lalu pilih tombol Mulai.

    Output yang diharapkan muncul di akhir kode.

Lihat juga