我的异步任务总是阻止UI

Nic*_*ico 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;
    }
Run Code Online (Sandbox Code Playgroud)

等待Task.Delay工作得很好,但等待JobAsync阻止了UI.为什么?谢谢.

Jon*_*eet 24

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

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

我怀疑在MSDN上退一步吸收一些关于异步的材料是个好主意...... 这是一个很好的起点 ......


L.B*_*L.B 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;
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 不是在方法内部启动任务,使用`await`在行上添加`Task.Run`调用可能更有意义,尽管最终结果(如果函数永远不会被重用)是相同的. (2认同)
  • 我在类似的情况下,仍然阻止UI线程.有没有明显的陷阱? (2认同)