it-roy-ru.com

В этом асинхронном методе отсутствуют операторы ожидания и он будет работать синхронно

моя программа имеет 3 предупреждения о следующем утверждении:

В этом асинхронном методе отсутствуют операторы ожидания и он будет работать синхронно . Попробуйте использовать оператор «await» для ожидания неблокирующих вызовов API, или 'await Task.Run (...)' для выполнения работы с процессором в фоновом потоке.

Что за предупреждение, попробуйте мне сказать? Что я должен делать? 

Это мой код: он работает с использованием многопоточности?

static void Main(string[] args)
{
    Task task1 = new Task(Work1);
    Task task2 = new Task(Work2);
    Task task3 = new Task(Work3);

    task1.Start();
    task2.Start();
    task3.Start();

    Console.ReadKey();
}

static async void Work1()
{
    Console.WriteLine("10 started");
    Thread.Sleep(10000);
    Console.WriteLine("10 completed");
}

static async void Work2()
{
    Console.WriteLine("3 started");
    Thread.Sleep(3000);
    Console.WriteLine("3 completed");
}

static async void Work3()
{
    Console.WriteLine("5 started");
    Thread.Sleep(5000);
    Console.WriteLine("5 completed");
}
4
mjb

Ключевое слово async само по себе мало что дает. Удалите его из своего кода, и ваш код будет действовать точно так же.

Что делает async?

  • Он изменяет то, что действительно внутри метода, в частности позволяет использовать ключевое слово await
  • В свою очередь это означает, что тело метода будет преобразовано на основе awaits, присутствующих в теле метода.
  • И если метод возвращает значение, метод также преобразуется для переноса возвращаемого значения в переменную Task.

Однако, если у вас а) нет awaits в теле вашего метода и б) возвращаются void, то ничего особенного не будет достигнуто. Предупреждение компилятора пытается прояснить это - метод async без каких-либо await просто не имеет смысла. awaits - более важная часть этой функции.

4
Damien_The_Unbeliever

Да, ваш код, вероятно, будет использовать многопоточность. Однако это все равно будет сделано, если вы просто удалите ключевое слово async. Поскольку вы не объяснили, почему это так, я предлагаю удалить его. 

Если вам нужен шаблон async/await, вы можете использовать Task.Delay(), но я бы посоветовал вам прочитать подробнее об async/await перед его использованием:

static async void Work3()
{
    Console.WriteLine("5 started");
    await Task.Delay(5000);
    Console.WriteLine("5 completed");
}
1
nvoigt

Вы использовали ключевое слово «async» с методом, который указывает, что методы Work1 (), Work2 () и Work3 () выполняются асинхронно, но вы не использовали ключевое слово «await». Так что оно выполняется синхронно. Используйте ключевое слово «await», если Вы хотите выполнить это асинхронно.

 static async void Work1()
 {
     Console.WriteLine("10 started");
    await Task.Delay(10000);
     Console.WriteLine("10 completed");
 }

 static async void Work2()
 {
     Console.WriteLine("3 started");
     await Task.Delay(3000);
     Console.WriteLine("3 completed");
 }

 static async void Work3()
 {
     Console.WriteLine("5 started");
     await Task.Delay(5000);
     Console.WriteLine("5 completed");
 }
1
jignesh

Вы определили свои методы (Work1, Work2, Work3) с ключевым словом async, но ни один из вашего кода в этих методах не использует оператор await для вызова асинхронных вызовов.

0
Hawkmooon