2015-01-11 92 views
-4

我知道异步和线程是两个非常不同的东西,第一个是开发异步行为,而另一个是同步或并行功能。但是我刚才注意到的一件事是,当目标是在长时间运行的任务期间保持应用程序响应并且活着时,使用Async和Await时,CPU的使用率会大大减少,并且像这样使用旧线程:性能:异步vs线程

Thread Task1 = new Thread(()=>{ 

     // Do Something 
}); 

Thread Task2 = new Thread(()=>{ 
     Task1.Start(); 
     while(true){ 
     if (!Task1.IsAlive){ 
      // Do something 
      break; 
     } 
     Thread.Sleep(50); 
     } 
}); 

我只是想知道是否正常看到异步具有更高的性能,因为我认为同一个senario是在异步任务的后台进行。在I约少5%的CPU使用率观察到对异步做同样的动作的性能测试应用

Thread.Sleep(50) -> thread 
await Task.Delay(50) -> Async 

:使用相同的延迟毫秒(50),用于两者。

+2

你正在比较橙子苹果。您需要澄清您的问题,因为您的代码示例执行两个不同的操作。 –

+0

@YuvalItzchakov:没有两个代码异步运行两个任务,再看一遍。线程在运行其他任务之前等待Task 1完成。同样在Async中完成,因为它正在等待。但异步消耗较少的CPU。 – Ricky

+4

'Thread.Sleep'和'Task.Delay'不会做同样的事情。 –

回答

0

从“保持应用程序响应”我的结论是你谈论一些Windows程序。

在这种情况下,异步/等待将在与该程序的其余部分相同的UI线程中运行。窗口调度器将按顺序执行异步部分。 (继续码的异步操作后本身将在UI线程上运行)

在另一方面,backgorund工作者(线程)将并行,可能在另一个核心(现在)运行

无论如何,CPU使用率告诉你没有什么关于发生了什么事情。

+3

“窗口调度程序将按顺序执行异步部分” - 这是不正确的。根据定义,异步操作不使用当前线程。另外,有些甚至不使用任何线程;他们只是利用现有的操作系​​统机制来允许独立于进程中任何正在运行的线程来完成操作。您似乎将异步操作本身与继续机制混淆了(即,在“await”语句完成后会发生什么),其中延迟默认在UI线程中执行。 –

+0

我改进了我的答案 – DrKoch