Кодовые блоки в обоих случаях.Оба примера плохие.Ни один из них не выполняется асинхронно.
Код консоли правильный будет:
public static async Task Main()
{
Console.WriteLine("Before LongOperationAsync");
int result = await LongOperationAsync();
Console.WriteLine("After LongOperationAsync");
Console.WriteLine("Result: {0}", result);
Console.ReadKey();
}
Эквивалентный код WPF будет:
private async void button2_Click(object sender, EventArgs e)
{
Debug.WriteLine("Before LongOperationAsync");
int result = await LongOperationAsync();
Debug.WriteLine("After LongOperationAsync");
Debug.WriteLine("Result: {0}", result);
}
async
является синтаксическим сахаром, который позволяет использовать ключевое слово await
.await
ожидает в асинхронном режиме для выполнения уже асинхронной операции, такой как Task.Delay()
, без блокировки исходного потока.Когда эта асинхронная операция завершается, await
возобновляет выполнение в исходном контексте синхронизации.В случае приложения WPF это поток пользовательского интерфейса.Это то, что позволяет обновлять пользовательский интерфейс после await
.
async void
только для обработчиков событий, таких как button2_click
.Во всех остальных случаях следует использовать async Task
.async void
методов нельзя ожидать, и приложение не может знать, завершены они или нет.