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