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


Предупреждение компилятора (уровень 1) CS4014

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

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

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

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

Рекомендуется отключить предупреждение только если абсолютно необходимо отменить ожидание асинхронного вызова для выполнения, а не метод создания исключений.В этом случае можно отключить предупреждения путем присвоения результата вызова задачи в переменную.

В следующем примере показано, как вызвать предупреждение, как отключить его и как ожидание вызова.

async Task CallingMethodAsync()
{
    resultsTextBox.Text += "\r\n  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.
    var 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 warning CS4014.
    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, 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. 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 += "\r\n  Returning from calling method.";
}


async Task CalledMethodAsync(int howLong)
{
    resultsTextBox.Text += 
        "\r\n    Entering called method, starting and awaiting Task.Delay.";

    // Slow the process down a little so that you can distinguish between
    // awaiting and not awaiting in the program's output. Adjust the value
    // for howLong if necessary.
    await Task.Delay(howLong);
    resultsTextBox.Text += 
        "\r\n    Task.Delay is finished--returning from called method.";
}

В этом примере, при выборе вызов №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.

Можно также отключить предупреждения компилятора с помощью директивы #pragma warning (Справочник по C#).

Пример

Следующее приложение Windows Presentation Foundation (WPF) содержит методы из предыдущего примера.Следующие шаги установки приложения.

  1. Создание приложения WPF с именем AsyncWarning.

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

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

  3. Замените код в представлении XAML файл MainWindow.xaml следующим кодом.

    <Window x:Class="AsyncWarning.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.cs следующим кодом.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace AsyncWarning
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private async void startButton_Click(object sender, RoutedEventArgs e)
            {
                resultsTextBox.Text += "\r\nEntering the Click event handler.";
                await CallingMethodAsync();
                resultsTextBox.Text += "\r\nExiting the Click event handler.";
            }
    
    
            async Task CallingMethodAsync()
            {
                resultsTextBox.Text += "\r\n  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.
                var 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 warning CS4014.
                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, 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. 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 += "\r\n  Returning from calling method.";
            }
    
    
            async Task CalledMethodAsync(int howLong)
            {
                resultsTextBox.Text += 
                    "\r\n    Entering called method, starting and awaiting Task.Delay.";
    
                // Slow the process down a little so that you can distinguish between
                // awaiting and not awaiting in the program's output. Adjust the value
                // for howLong if necessary.
                await Task.Delay(howLong);
                resultsTextBox.Text += 
                    "\r\n    Task.Delay is finished--returning from called method.";
            }
        }
    
        // Output with Call #1 or Call #2. (Wait for the last line to appear.)
    
        // 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 with Call #3, which awaits the call to CalledMethodAsync.
    
        // 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, чтобы запустить программу, а затем нажмите кнопку Start.

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

См. также

Ссылки

await (Справочник по C#)

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

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