Share via


Da auf diesen Aufruf nicht gewartet wird, wird die aktuelle Methode vor Abschluss des Aufrufs fortgesetzt

Fehlermeldung

Da auf diesen Aufruf nicht gewartet wird, wird die Ausführung der aktuellen Methode vor Abschluss des Aufrufs fortgesetzt.Betrachten Sie das Anwenden "erwarten" Operator zum Ergebnis des Aufrufs.

Die aktuelle Methode ruft eine asynchrone Methode, die Task oder Task zurückgibt und den Rechnen Sie-Operator nicht zum Ergebnis angewendet wird. Der Aufruf der Methode async startet eine asynchrone Aufgabe. Da kein Await-Operator angewendet wird, wird das Programm fortgesetzt, ohne auf die Aufgabe gewartet wird. In den meisten Fällen wird dieses Verhalten nicht erwartet. Normalerweise sind weitere Aspekte des Aufrufs von Methoden aus den Ergebnissen des Aufrufs überein, oder wird nur die aufgerufene Methode erwartet, dass abzuschließen, bevor Sie von der Methode aufgerufen, die den Aufruf von enthält.

Ein gleichmäßig wichtiges Problem ist, was geschieht mit Ausnahmen, die in die aufgerufene asynchrone Methode ausgelöst werden. Eine Ausnahme, die in einer Methode ausgelöst wird, die Task oder Task zurückgibt, wird in der zurückgegebenen Aufgabe gespeichert. Wenn Sie nicht die Aufgabe oder explizit die Überprüfung für Ausnahmen erwarten, dass die Ausnahme verloren. Wenn Sie die Aufgabe erwarten, wird die Ausnahme erneut ausgelöst.

Als Best Practice sollten Sie den Aufruf immer erwarten.

Standardmäßig ist diese Meldung eine Warnung. Weitere Informationen über das Ausblenden von Warnungen bzw. über die Behandlung von Warnungen als Fehler finden Sie unter Konfigurieren von Warnungen in Visual Basic.

Fehler-ID: BC42358

So reagieren Sie auf diese Warnung

  • Sie sollten die Warnung zu unterdrücken, sollten nur, wenn Sie sicher sind, dass Sie nicht auf den asynchronen Aufruf warten möchten, und dass die aufgerufene Methode keine Ausnahmen auslöst. In diesem Fall können Sie die Warnung unterdrücken, indem Sie das Aufgabenergebnis des Anrufs einer Variablen zuweisen.

    Im folgenden Beispiel wird gezeigt, wie die Warnung verursacht, wie sie unterdrückt und wie der Aufruf erwartet.

        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
    

    Im Beispiel wenn Sie aufrufen #1 auswählen oder Nr. aufrufen, sind die unawaited Ende asynchrone Methode (CalledMethodAsync) nach dem Aufrufer (CallingMethodAsync) und dem Aufrufer des Aufrufers (StartButton_Click vollständig). Die letzte Zeile in der folgenden Ausgabe zeigt Sie wenn die aufgerufenen Methodenende an. Eintrag zu beenden und vom Ereignishandler, der CallingMethodAsync im vollständigen Beispiel aufruft, werden in der Ausgabe markiert.

    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.
    

Beispiel

Die folgenden WPF- (Windows Presentation Foundation) enthält die Methoden aus dem vorherigen Beispiel. Die folgenden Schritte installierten die Anwendung.

  1. Erstellen einer WPF-Anwendung und benennen Sie sie AsyncWarning.

  2. In Visual Studio MainWindow.xaml wählen Sie die Registerkarte aus.

    Wenn die Registerkarte nicht sichtbar ist, öffnen Sie das Kontextmenü für MainWindow.xaml in Projektmappen-Explorer, und wählen Sie dann Code anzeigen aus.

  3. Ersetzen Sie den Code in der Ansicht XAML der Datei MainWindow.xaml durch den folgenden Code.

    <Window x:Class="MainWindow"
            xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="https://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>
    

    Ein einfaches Fenster, das eine Schaltfläche und ein Textfeld enthält, wird in der Ansicht Design der Datei MainWindow.xaml.

    Weitere Informationen zu den XAML-Designer, finden Sie unter Erstellen einer Benutzeroberfläche mit dem XAML-Designer. Informationen darüber, wie Sie ein eigenes einfache Benutzeroberfläche, finden Sie unter ", um eine WPF-Anwendung erstellen" und ", ein einfaches Abschnitte WPF MainWindow entwerfen" von Exemplarische Vorgehensweise: Zugreifen auf das Web mit Async und Await (C# und Visual Basic) erstellt.

  4. Ersetzen Sie den Code in MainWindow.xaml.vb durch den folgenden Code.

    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. Wählen Sie die F5-TASTE, um das Programm auszuführen, und wählen Sie dann die Schaltfläche Start aus.

    Die erwartete Ausgabe wird am Ende des Codes.

Siehe auch

Referenz

Await-Operator (Visual Basic)

Konzepte

Asynchrone Programmierung mit Async und Await (C# und Visual Basic)