我有这样的方法:
private async Task DoSomething()
{
// long running work here.
}
当我调用这样的方法时,它会阻止UI:
Task t = DoSomething();
我必须做其中一项才能使其无阻塞:
Task t = new Task(() => DoSomething());
t.Start();
// Or
Task t = Task.Factory.StartNew(() => DoSomething());
那么当您可以像在框架4中那样使用任务并使用Task.Wait()
代替await
时,async / await的重点是什么?
编辑: 我理解你的所有答案 - 但没有一个真正解决我的最后一段。任何人都可以给我一个基于任务的多线程的例子,其中async / await提高了程序的可读性和/或流程吗?
答案 0 :(得分:4)
您是如何使用await
的?这不会阻止UI:
private async Task DoSomething()
{
await Task.Delay(5000);
}
private async void button1_Click(object sender, EventArgs e)
{
await DoSomething();
MessageBox.Show("Finished");
}
请注意,我没有必要编写任何详细的回调内容。这就是async
/ await
的重点。
答案 1 :(得分:2)
async
方法同步开始执行。 async
对于编写异步操作很有用,但除非你告诉它,否则它不会神奇地使代码在另一个线程上运行。
您可以使用Task.Run
将受CPU限制的工作安排到线程池线程。
有关详细信息,请参阅我的async
/ await
intro post或async
FAQ。
答案 2 :(得分:0)
如果没有实际的代码,很难告诉你发生了什么,但你可以用'await Task.Yield();'来启动你的DoSomething。强制它立即返回,以防在第一次等待之前运行的是导致UI问题的原因。