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

Моя задача 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 блокирует пользовательский интерфейс. Зачем? Спасибо.

4b9b3361

Ответ 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... это хорошая отправная точка...