异步任务被冻结UI(async Task is freezing the UI)

2019-07-31 22:33发布

我有这样的方法:

private async Task DoSomething()
{
    // long running work here.
}

当我打电话这样它会阻止用户界面的方法:

Task t = DoSomething();

我要做的其中之一,使其非阻塞:

Task t = new Task(() => DoSomething());
t.Start();

// Or

Task t = Task.Factory.StartNew(() => DoSomething());

那么,什么是异步电动机/等待时,你可以使用任务,因为他们在框架4,使用点Task.Wait()代替await

编辑:我明白你的答案的 - 但没有真正解决我的最后一段。 谁能给我工作的一个例子基于多线程异步哪里/ AWAIT提高了程序的可读性和/或流动?

Answer 1:

async方法同步开始它们的执行。 async是构成异步操作是有用的,但它不会神奇地让另一个线程上运行的代码,除非你告诉它。

您可以使用Task.Run调度CPU绑定工作提高到一个线程池线程。

见我的async / await开场后或async常见问题以获取更多信息。



Answer 2:

你如何使用await ? 这不会阻止用户界面:

    private async Task DoSomething()
    {
        await Task.Delay(5000);
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        await DoSomething();
        MessageBox.Show("Finished");
    }

请注意,我没有写任何详细回调的东西。 这点async / await



Answer 3:

如果没有实际的代码,这是很难告诉你这是怎么回事,但你就可以开始你的DoSomething“等待Task.Yield();” 迫使其立即返回,在什么运行之前,首先是AWAIT什么导致你的UI问题的情况下。



文章来源: async Task is freezing the UI