Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Da dieser Aufruf nicht erwartet wird, wird die Ausführung der aktuellen Methode fortgesetzt, bevor der Aufruf abgeschlossen ist. Erwägen Sie, den Await Operator auf das Ergebnis des Anrufs anzuwenden.
Die aktuelle Methode ruft eine asynchrone Methode auf, die eine Task oder eine Task<TResult> methode zurückgibt und den Await-Operator nicht auf das Ergebnis anwendet. Der Aufruf der asynchronen Methode startet eine asynchrone Aufgabe. Da jedoch kein Await Operator angewendet wird, wird das Programm fortgesetzt, ohne auf den Abschluss der Aufgabe zu warten. In den meisten Fällen wird dieses Verhalten nicht erwartet. In der Regel sind andere Aspekte der aufrufenden Methode von den Ergebnissen des Aufrufs oder minimal davon abhängig, dass die aufgerufene Methode abgeschlossen ist, bevor Sie von der Methode zurückgeben, die den Aufruf enthält.
Ein ebenso wichtiges Problem ist, was mit Ausnahmen geschieht, die in der sogenannten asynchronen Methode ausgelöst werden. Eine Ausnahme, die in einer Methode ausgelöst wird, die eine Task oder Task<TResult> die in der zurückgegebenen Aufgabe gespeichert wird. Wenn Sie nicht auf die Aufgabe warten oder explizit nach Ausnahmen suchen, geht die Ausnahme verloren. Wenn Sie auf die Aufgabe warten, wird die Ausnahme erneut ausgelöst.
Als bewährte Methode sollten Sie immer auf den Anruf warten.
Diese Meldung ist standardmäßig eine Warnung. Weitere Informationen zum Ausblenden von Warnungen oder zum Behandeln von Warnungen als Fehler finden Sie unter Konfigurieren von Warnungen in Visual Basic.
Fehler-ID: BC42358
So beheben Sie diese Warnung
Sie sollten die Warnung nur unterdrücken, wenn Sie sicher sind, dass Sie nicht warten möchten, bis der asynchrone Aufruf abgeschlossen ist und dass die aufgerufene Methode keine Ausnahmen auslösen wird. In diesem Fall können Sie die Warnung unterdrücken, indem Sie das Aufgabenergebnis des Aufrufs einer Variablen zuweisen.
Das folgende Beispiel zeigt, wie die Warnung verursacht wird, wie sie unterdrückt wird und wie sie auf den Anruf wartet:
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
Wenn Sie in dem Beispiel "Call #1" oder "Call #2" auswählen, wird die nicht angezeigte asynchrone Methode (CalledMethodAsync) beendet, nachdem sowohl der Aufrufer (CallingMethodAsync) als auch der Aufrufer (StartButton_Click) des Aufrufers () abgeschlossen sind. Die letzte Zeile in der folgenden Ausgabe zeigt, wann die aufgerufene Methode abgeschlossen ist. Der Eintrag zum und Beenden des Ereignishandlers, der im vollständigen Beispiel aufgerufen CallingMethodAsync wird, wird 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 folgende WPF-Anwendung (Windows Presentation Foundation) enthält die Methoden aus dem vorherigen Beispiel. Die folgenden Schritte richten die Anwendung ein:
Erstellen Sie eine WPF-Anwendung, und nennen Sie sie
AsyncWarning.Wählen Sie im Visual Studio Code-Editor die Registerkarte "MainWindow.xaml " aus.
Wenn die Registerkarte nicht sichtbar ist, öffnen Sie das Kontextmenü für "MainWindow.xaml" im Projektmappen-Explorer, und wählen Sie dann "Code anzeigen" aus.
Ersetzen Sie den Code in der XAML-Ansicht von "MainWindow.xaml" durch den folgenden Code:
<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>Ein einfaches Fenster mit einer Schaltfläche und einem Textfeld wird in der Entwurfsansicht von "MainWindow.xaml" angezeigt.
Weitere Informationen zum XAML-Designer finden Sie unter Erstellen einer Benutzeroberfläche mithilfe von XAML-Designer. Informationen zum Erstellen einer eigenen einfachen Benutzeroberfläche finden Sie in den Abschnitten "So erstellen Sie eine WPF-Anwendung" und "So entwerfen Sie einen einfachen WPF MainWindow"-Abschnitt der Exemplarischen Vorgehensweise: Zugreifen auf das Web mithilfe von Async und Await.
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.Wählen Sie die F5-TASTE aus, um das Programm auszuführen, und wählen Sie dann die Schaltfläche " Start " aus.
Die erwartete Ausgabe wird am Ende des Codes angezeigt.