编辑
2025-09-24
C#
00

目录

摘要
正文
为什么说await提升了性能?
异步方法不一定创建新线程

摘要


大家会发现,C# await还是等待了呀,没有提升什么呀?

await调用的等待期间,NET会把当前的线程返回给线程池等异步方法调用执行完毕后,框架会从线程池再取出来一个线程执行后续的代码。

正文


为什么说await提升了性能?

当我们说await提升了性能时,我们实际上是在强调异步编程模型的优势。通过使用await,应用程序可以在等待异步操作完成时释放当前线程,这意味着线程可以用来执行其他任务,从而提高了应用程序的响应性和吞吐量。这在处理大量并发请求的服务器应用程序或提高UI应用程序响应性时特别有用。

写一个例子

C#
static async Task Main(string[] args) { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 100000; i++) { sb.AppendLine("hi....."); } await File.WriteAllTextAsync("./a.txt", sb.ToString()); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); }

image.png

你会发现,第一次Id是1,经过await后,id变成了12,说明这里线程切换了。

线程切换对于性能是有消耗的。

看到这里,是不是发现异步与多线程还是不一样

C#
static async Task Main(string[] args) { Console.WriteLine("Main Before:" + Thread.CurrentThread.ManagedThreadId); await DoSync(); Console.WriteLine("Main After:" + Thread.CurrentThread.ManagedThreadId); } static async Task DoSync() { Console.WriteLine("DoSync:" + Thread.CurrentThread.ManagedThreadId); string s = ""; for (int i = 0; i < 10000; i++) { s+= i.ToString(); } }

发现ManagedThreadId都一样,这块没有产生新的线程

修改加上Task.Run

C#
static async Task Main(string[] args) { Console.WriteLine("Main Before:" + Thread.CurrentThread.ManagedThreadId); await Task.Run(async () => { await DoSync(); }); Console.WriteLine("Main After:" + Thread.CurrentThread.ManagedThreadId); }

image.png

异步方法不一定创建新线程

首先,使用async关键字标记的方法称为异步方法。这个关键字本身并不启动任何新的线程。同样,await关键字也不会创建新线程。它们的主要作用是提供一种不阻塞当前线程而等待另一操作完成的能力。当await一个异步操作(通常是返回TaskTask<T>的操作)时,如果该操作已经完成,代码将同步地继续执行,而不会有任何线程切换。如果操作尚未完成,当前方法的执行将在此暂停,控制权返回给调用者,而当前线程可以去执行其他工作。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!