异步任务正在冻结UI

时间:2012-09-26 00:25:52

标签: c# .net-4.5 async-await

我有这样的方法:

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提高了程序的可读性和/或流程吗?

3 个答案:

答案 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 postasync FAQ

答案 2 :(得分:0)

如果没有实际的代码,很难告诉你发生了什么,但你可以用'await Task.Yield();'来启动你的DoSomething。强制它立即返回,以防在第一次等待之前运行的是导致UI问题的原因。