我的异步任务总是阻止UI

在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 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。 为什么? 谢谢。

试试这个:

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

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

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

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