C# 异步任务正在冻结UI

C# 异步任务正在冻结UI,c#,.net-4.5,async-await,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(() => DoSom

我有这样一种方法:

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有什么意义呢

编辑:
我理解你所有的答案,但没有一个能真正解决我最后一段的问题。有谁能给我举个基于任务的多线程的例子,异步/await可以提高程序的可读性和/或流程吗?

您如何使用
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

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

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

您可以使用
Task.Run
将CPU绑定的工作安排到线程池线程


有关更多信息,请参阅my或。

异步的目的不是多线程。它用于异步编程。您可以使用
Task.Run
执行多线程处理,但
async
也可以与其他异步操作(如I/O)一起使用。基于任务的异步模式功能强大,因为它可以处理任何异步操作(无论是CPU绑定、I/O绑定还是其他)同样,这不会阻塞UI,因为Task.Delay使用System.Threading.Timer,它在线程池上运行。尝试使用Thread.Sleep(5000),你会看到UI阻塞了。顺便说一句,在我看来,使用async不需要创建线程的想法是完全错误的。事实上,wait只能应用于返回Task或Task的方法,这显然表明在某个时候,有人必须创建一个新任务@BrunoSantos是正确的,因为前面提到了
System.Threading.Timer