性能:异步与线程

本文关键字:线程 异步 性能 | 更新日期: 2023-09-27 18:37:02

我知道异步和线程是两个非常不同的东西,因为第一个用于开发异步行为,而另一个用于同步或并行函数。但是我刚才注意到的一件事是,当目标是在长时间运行的任务期间保持应用程序响应和活动时,当使用 Async 和 Await 时,与使用这样的线程执行旧方式相比,CPU 使用率要低得多:

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

我只想知道看到异步具有更高的性能是否正常,因为我认为异步任务在后台进行相同的senario。对两者使用相同的延迟毫秒 (50):

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

在性能测试应用程序中,我观察到异步上的 CPU 使用率大约减少了 5%,用于执行相同的操作。

性能:异步与线程

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

在这种情况下,async/await 将与程序的其余部分在同一个 UI 线程中运行。窗口调度程序将按顺序执行异步部分以及其余部分。(异步操作本身之后的继续代码将在 UI 线程上运行)

另一方面,backgorund worker(线程)将并行运行,并且可能在另一个内核上运行(现在)。

无论如何,CPU 使用率不会告诉您发生了什么。