Модификатор 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);
}
Оба из них блокируют мой пользовательский интерфейс. Я знаю, что я должен начать другой поток, чтобы избежать блокировки, но я нашел:
"Асинхронный метод обеспечивает удобный способ выполнения потенциально долговременной работы без блокировки потока вызывающего".
Я немного смущен.
Ответы
Ответ 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!