Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Так как этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова. Рассмотрите возможность применения Await
оператора к результату вызова.
Текущий метод вызывает асинхронный метод, который возвращает Task или не Task<TResult> применяет оператор Await к результату. Вызов асинхронного метода запускает асинхронную задачу. Однако, так как оператор не Await
применяется, программа продолжается без ожидания завершения задачи. В большинстве случаев это поведение не ожидается. Обычно другие аспекты вызывающего метода зависят от результатов вызова или, минимально, вызываемый метод должен завершиться перед возвратом из метода, содержащего вызов.
В равной степени важной проблемой является то, что происходит с исключениями, которые возникают в вызываемом асинхронном методе. Исключение, которое возникает в методе, который возвращает Task или Task<TResult> хранится в возвращаемой задаче. Если вы не ожидаете задачу или явным образом проверяете наличие исключений, это исключение будет потеряно. Если вы ожидаете задачу, его исключение будет повторно rown.
Рекомендуется всегда ожидать звонка.
По умолчанию данное сообщение является предупреждением. Дополнительные сведения о скрытии предупреждений или обработке предупреждений в качестве ошибок см. в разделе "Настройка предупреждений" в Visual Basic.
Идентификатор ошибки: BC42358
Устранение этого предупреждения
Рекомендуется отключить предупреждение только в том случае, если вы уверены, что не хотите ожидать завершения асинхронного вызова, и что вызывающий метод не вызовет никаких исключений. В этом случае можно отключить предупреждение, назначив результат задачи вызова переменной.
В следующем примере показано, как вызвать предупреждение, как отключить его и как ожидать вызова:
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
В этом примере, если выбрать call #1 или Call #2, метод асинхронного асинхронного (CalledMethodAsync
) завершается после завершения вызывающего метода (CallingMethodAsync
) и вызывающего абонентаStartButton_Click
(). Последняя строка в следующих выходных данных показывает, когда вызывается метод. В выходных данных помечаются вход и выход из обработчика событий, вызывающего CallingMethodAsync
в полном примере.
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.
Пример
Следующее приложение Windows Presentation Foundation (WPF) содержит методы из предыдущего примера. Следующие шаги настраивают приложение:
Создайте приложение WPF и назовите его
AsyncWarning
.В редакторе Visual Studio Code выберите вкладку MainWindow.xaml .
Если вкладка не отображается, откройте контекстное меню mainWindow.xaml в обозревателе решений и выберите команду View Code.
Замените код в представлении XAML MainWindow.xaml следующим кодом:
<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>
Простое окно, содержащее кнопку и текстовое поле, отображается в представлении конструктора MainWindow.xaml.
Дополнительные сведения о конструкторе XAML см. в статье "Создание пользовательского интерфейса с помощью конструктора XAML". Сведения о создании собственного простого пользовательского интерфейса см. в разделах "Создание приложения WPF" и "Создание простого приложения WPF MainWindow" в пошаговом руководстве. Доступ к Интернету с помощью асинхронного и await.
Замените код в MainWindow.xaml.vb следующим кодом.
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.
Нажмите клавишу F5, чтобы запустить программу, а затем нажмите кнопку Start .
Ожидаемые выходные данные отображаются в конце кода.