我的异步任务总是阻止UI

时间:2012-10-08 17:41:12

标签: c# multithreading asynchronous dispatcher async-await

在WPF 4.5应用程序中,我不明白为什么在使用await + a task时UI被阻止了:

    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;
    }

await Task.Delay运行良好,但等待JobAsync阻止UI。为什么? 谢谢。

2 个答案:

答案 0 :(得分:24)

您应该收到关于JobAsync的警告 - 它不包含await个表达式。 所有您的工作仍在UI线程上完成。这个方法真的没有异步。

将方法标记为async不会使其在不同的线程上运行 - 它更容易将异步操作连接在一起,并返回到适当的上下文。

我怀疑退后一步并在MSDN上吸收一些关于异步的资料是个好主意... this is a good starting point ...

答案 1 :(得分:10)

试试这个:

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;
    });
}