4

我有这样的方法:

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

4

3 回答 3

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

于 2012-09-26T00:42:09.357 回答
2

async方法同步开始执行。async对于组合异步操作很有用,但除非您告诉它,否则它不会神奇地使代码在另一个线程上运行。

您可以使用Task.Run将 CPU 密集型工作安排到线程池线程。

有关更多信息,请参阅我的async/await介绍帖子async常见问题解答

于 2012-09-26T02:44:30.120 回答
0

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

于 2012-09-26T01:59:17.033 回答