14

在 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 效果很好,但 await JobAsync 会阻塞 UI。为什么 ?谢谢你。

4

2 回答 2

26

你应该得到一个警告JobAsync——它不包含任何await表达式。您的所有工作仍在 UI 线程上完成。该方法实际上没有任何异步。

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

我怀疑退后一步并吸收 MSDN 上有关异步的一些材料是个好主意……这是一个很好的起点……

于 2012-10-08T17:46:40.250 回答
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;
    });
}
于 2012-10-08T17:45:09.987 回答