Моя задача async всегда блокирует пользовательский интерфейс
В приложении WPF 4.5 я не понимаю, почему пользовательский интерфейс заблокирован, когда я использовал ожидание + задание:
private async void Button_Click(object sender, RoutedEventArgs e)
{
// Task.Delay works great
//await Task.Delay(5000);
double value = await JobAsync(25.0);
MessageBox.Show("finished : " + value.ToString());
}
private async Task<double> JobAsync(double value)
{
for (int i = 0; i < 30000000; i++)
value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75)));
return value;
}
Ожидание Task.Delay отлично работает, но ждать JobAsync блокирует пользовательский интерфейс. Зачем?
Спасибо.
Ответы
Ответ 1
Попробуйте следующее:
private Task<double> JobAsync(double value)
{
return Task.Factory.StartNew(() =>
{
for (int i = 0; i < 30000000; i++)
value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75)));
return value;
});
}
Ответ 2
Вы должны получать предупреждение о JobAsync
- он не содержит выражений await
. Вся ваша работа по-прежнему выполняется в потоке пользовательского интерфейса. В этом методе нет ничего асинхронного.
Маркировка метода как async
не заставляет его работать в другом потоке - тем более упрощает объединение асинхронных операций и возвращается в соответствующий контекст.
Я подозреваю, что было бы неплохо сделать шаг назад и поглотить некоторые материалы об асинхронном использовании MSDN... это хорошая отправная точка...