Шаг 1, воспроизведите
public void Method()
{
SomeMethod();
SomeMethod();
ExecuteParallelAsync(); //< ---fire and forget
SomeMethod();
SomeMethod();
Console.ReadLine();
}
private void SomeMethod() => Console.WriteLine($"SomeMethod");
private async void ExecuteParallelAsync()
{
Console.WriteLine($"START");
await Task.Delay(TimeSpan.FromMilliseconds(100));
Console.WriteLine($"END");
}
Вывод
SomeMethod
SomeMethod
START
SomeMethod
SomeMethod
END
Шаг 2, попытка исправить
"О, да, я забыл дождаться своей функции"
await ExecuteParallelAsync(); //Change 1. "I forgot to await"
Выход
Compilation error (line 12, col 3): The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.
Compilation error (line 12, col 3): Cannot await 'void'
Шаг 3, исправление
Устранение обеих ошибок из шага 2.
// Change 2
// was:public void Main()
// which caused: "The 'await' operator can only (...)"
public async Task Main()
(...)
// Change 3
// was: private async void ExecuteParallelAsync()
// which caused "Compilation error (line 12, col 3): Cannot await 'void'"
private async Task ExecuteParallelAsync()
Выполнение.
Вывод:
SomeMethod
SomeMethod
START
END
SomeMethod
SomeMethod
Для справки, мы могли бы ожидать ExecuteParallelAsync
без ключевого слова await
, но await
- правильный путь во всех сценариях, кроме tiny меньшинство там, где его нет.