在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。为什么? 谢谢。
答案 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;
});
}