Подтвердить что ты не робот

Модификатор Async в С#

У меня вопрос, в чем разница между этими двумя методами?

    async private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        Thread.Sleep(2000);
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        Thread.Sleep(2000);
    }

Оба из них блокируют мой пользовательский интерфейс. Я знаю, что я должен начать другой поток, чтобы избежать блокировки, но я нашел:

"Асинхронный метод обеспечивает удобный способ выполнения потенциально долговременной работы без блокировки потока вызывающего".

Я немного смущен.

4b9b3361

Ответ 1

Добавление async само по себе не делает ничего, кроме как позволить телу метода использовать ключевое слово await. Правильно реализованный метод async не будет блокировать поток пользовательского интерфейса, но, безусловно, может быть реализовано неправильно.

Что вы, вероятно, хотели сделать, это:

async private void Button_Click_1(object sender, RoutedEventArgs e)
{
    await Task.Delay(2000);
    MessageBox.Show("All done!");
}

Ответ 2

async сам по себе не включит асинхронный (неблокирующий) вызов метода.
Вы должны использовать await внутри функции async.

Вы должны прочитать этот, чтобы лучше понять эту возможность.

Ответ 3

1) Работа с ключом Async делает метод асинхронным без блокировки по времени. Async должен существовать с ожиданием, которое говорит, чтобы ждать завершения задачи, но все вещи будут выполнены.

async private void Button_Click_1(object sender, RoutedEventArgs e)
{
    var task = Task.Delay(1000);

    /*Do stuff*/

    await task;
}

2) Просто создайте поток только для сна, любой код, указанный выше, не будет выполнен, только после того, как поток завершит выполнение задачи.

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    Thread.Sleep(2000);
    /*Do stuff*/
}

Хорошо читается в msdn Асинхронное программирование с помощью Async и Await!