Поделиться через


Поскольку этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова.

Сообщение об ошибке

Поскольку этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова.Рассмотрим применение оператора «подождите» к результату вызова.

Текущие вызовы методов асинхронного метода, который возвращает Task или Task<TResult> и не применяет оператор подождите к результату.Вызов метода async начинает асинхронную задачу.Однако поскольку отсутствует оператор Await не применяется программа продолжается без ожидания завершения задачи.В большинстве случаев этой функциональности не ожидается.Обычно предполагается, что завершаются другие аспекты при вызове метода зависит от результатов вызова или минимум, вызванного метода, прежде чем вернуть из метода, который содержит вызов.

Являются важным вопросом, что происходит с исключениями, которые возникают в методе async.Исключение, которое возникает в методе, который получает Task или Task<TResult> хранится в возвращенной задачей.Если не ждете задачи или явно не проверяется для исключений, то исключение потеряно.Если ожидается задачи, исключение вызывается заново.

Как правило, следует всегда ожидания вызова.

По умолчанию это сообщение является предупреждающим.Дополнительные сведения о скрытии предупреждений или их обработке как ошибок см. в разделе Настройка предупреждений в 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
    

    В этом примере при выборе вызов #1 или вызовите #2, то unawaited завершения выполнения метода асинхронного (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) содержит методы из предыдущего примера.Следующие шаги настройки приложения.

  1. Создание приложения WPF и назовите его AsyncWarning.

  2. В Visual Studio закодируйте редактор выберите вкладку MainWindow.xaml.

    Если вкладка не отображается, то открыть контекстное меню для MainWindow.xaml в Обозреватель решений, а затем выберите Перейти к коду.

  3. Замените код в представлении *** язык XAML *** MainWindow.xaml следующим кодом.

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

    Простое окно, содержащее кнопку и текстовое поле отображается в представлении Разработка MainWindow.xaml.

    Дополнительные сведения о конструкторе XAML см. в разделе Создание пользовательского интерфейса с помощью конструктора XAML.Сведения о том, как построить собственный простой пользовательский интерфейс см. в разделе «создание приложения WPF» и «разработать простое разделах WPF MainWindow» Пошаговое руководство. Получение доступа к Интернету с помощью модификатора Async и оператора Await (C# и Visual Basic).

  4. Замените код в 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.
    
  5. Выберите ключ F5, чтобы запустить программу, а затем нажмите кнопку Запуск.

    Ожидаемый результат отображается в конце кода.

См. также

Ссылки

Оператор Await (Visual Basic)

Основные понятия

Асинхронное программирование с использованием ключевых слов Async и Await (C# и Visual Basic)