Udostępnij za pośrednictwem


BC42358: Ponieważ to wywołanie nie jest oczekiwane, wykonanie bieżącej metody jest kontynuowane przed ukończeniem wywołania

Ponieważ to wywołanie nie jest oczekiwane, wykonanie bieżącej metody jest kontynuowane przed ukończeniem wywołania. Rozważ zastosowanie Await operatora do wyniku wywołania.

Bieżąca metoda wywołuje metodę asynchroniową, która zwraca Task wartość lub i Task<TResult> nie stosuje operatora Await do wyniku. Wywołanie metody asynchronicznej rozpoczyna zadanie asynchroniczne. Jednak ze względu na to, że żaden operator nie Await jest stosowany, program będzie kontynuowany bez oczekiwania na ukończenie zadania. W większości przypadków takie zachowanie nie jest oczekiwane. Zwykle inne aspekty metody wywołującej zależą od wyników wywołania lub, co najmniej, wywoływana metoda ma zostać ukończona przed zwróceniem z metody zawierającej wywołanie.

Równie ważnym problemem jest to, co dzieje się z wyjątkami zgłaszanymi w wywoływanej metodzie async. Wyjątek zgłoszony w metodzie zwracającej element Task lub Task<TResult> jest przechowywany w zwróconym zadaniu. Jeśli nie oczekujesz na zadanie lub jawnie sprawdź wyjątki, wyjątek zostanie utracony. Jeśli oczekujesz na zadanie, jego wyjątek zostanie ponownie zgłoszony.

Najlepszym rozwiązaniem jest zawsze oczekiwanie na połączenie.

Domyślnie ten komunikat jest ostrzeżeniem. Aby uzyskać więcej informacji na temat ukrywania ostrzeżeń lub traktowania ostrzeżeń jako błędów, zobacz Konfigurowanie ostrzeżeń w Visual Basic.

Identyfikator błędu: BC42358

Aby rozwiązać to ostrzeżenie

Należy rozważyć pominięcie ostrzeżenia tylko wtedy, gdy na pewno nie chcesz czekać na zakończenie wywołania asynchronicznego i że wywołanie wywoływane przez wywołanie wywołania asynchronicznego nie będzie zgłaszać żadnych wyjątków. W takim przypadku można pominąć ostrzeżenie, przypisując wynik zadania wywołania do zmiennej.

W poniższym przykładzie pokazano, jak spowodować ostrzeżenie, jak go pominąć i jak oczekiwać na wywołanie:

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

W tym przykładzie, jeśli wybierzesz pozycję Wywołaj #1 lub Wywołaj #2, metoda asynchronizowana (CalledMethodAsync) zakończy się po zakończeniu zarówno wywołania (CallingMethodAsync), jak i wywołującego (StartButton_Click). Ostatni wiersz w poniższych danych wyjściowych jest wyświetlany po zakończeniu wywoływanej metody. Wpis do i wyjście z programu obsługi zdarzeń, który wywołuje CallingMethodAsync w pełnym przykładzie, są oznaczone w danych wyjściowych.

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.

Przykład

Poniższa aplikacja Windows Presentation Foundation (WPF) zawiera metody z poprzedniego przykładu. Następujące kroki umożliwiają skonfigurowanie aplikacji:

  1. Utwórz aplikację WPF i nadaj jej AsyncWarningnazwę .

  2. W edytorze programu Visual Studio Code wybierz kartę MainWindow.xaml .

    Jeśli karta nie jest widoczna, otwórz menu skrótów dla pliku MainWindow.xaml w Eksplorator rozwiązań, a następnie wybierz pozycję Wyświetl kod.

  3. Zastąp kod w widoku XAML pliku MainWindow.xaml następującym kodem:

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

    W widoku Projekt mainWindow.xaml zostanie wyświetlone proste okno zawierające przycisk i pole tekstowe.

    Aby uzyskać więcej informacji na temat Projektant XAML, zobacz Tworzenie interfejsu użytkownika przy użyciu Projektant XAML. Aby uzyskać informacje na temat tworzenia własnego prostego interfejsu użytkownika, zobacz sekcje "Aby utworzyć aplikację WPF" i "Aby zaprojektować prostą główną platformę WPF" w sekcji Przewodnik: uzyskiwanie dostępu do sieci Web przy użyciu Async i Await.

  4. Zastąp kod w MainWindow.xaml.vb następującym kodem.

    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. Wybierz klawisz F5, aby uruchomić program, a następnie wybierz przycisk Uruchom .

    Oczekiwane dane wyjściowe są wyświetlane na końcu kodu.

Zobacz też