编辑
2025-09-24
C#
00

摘要


大家会发现,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); }
编辑
2025-09-24
C#
00

摘要

Async/Await是C# 5引入的关键字,旨在提高用户界面响应能力和对Web资源的访问能力,同时它使异步代码的编写变得更加容易。在C#中,异步编程可以使代码更加简洁、高效和易于维护。异步编程的一个重要挑战是处理异步操作完成后的结果,以避免阻塞主线程并保持用户界面的响应性。

  1. 并非一次完成,而且分多次完成
  2. 并非由同一个线程完成,而是线程池每次动态分配一个线程来处理;

正文

microsoft 的一篇文档 Task asynchronous programming model,它描述了在异步编程中控制流是如何在方法之间移动的。

编辑
2025-09-24
C#
00

摘要

使用C#的异步编程可以非常方便地完成下载文件的功能。异步编程是指一种编程模型,其中某些操作不会阻塞程序的执行,而是在异步线程中执行。这种方式可以提高程序的性能,并且可以避免阻塞其他操作的执行。在下载文件的情境下,使用异步编程可以保证下载进程的顺利进行,而不会导致整个程序的崩溃。

正文

不带返回例子

C#
internal class Program { static async Task Main(string[] args) { await DownloadHtmlAsync("http://www.baidu.com", "baidu.txt"); } static async Task DownloadHtmlAsync(string url, string filename) { using (HttpClient client = new HttpClient()) { string html = await client.GetStringAsync(url); await File.WriteAllTextAsync("./" + filename, html); } } }
编辑
2025-09-24
C#
00

摘要

在C#中,异步方法可以使用async关键字修饰,这是一种非常方便的编程方式。使用异步方法可以使程序更加高效和灵活,因为它们不会阻塞线程并且可以同时执行多个任务。下面我们将介绍如何使用async关键字来定义C#中的异步方法。

首先,让我们来了解一下什么是异步方法。异步方法是指在某个方法中可能需要执行耗时的操作,但是不会阻塞当前的线程,可以在其他线程上执行。在异步方法中,我们可以使用async关键字来标记该方法是异步方法,从而使其在执行完成后继续执行异步代码。

正文

基本概念

  • async: 用于修饰方法,表示这个方法是异步的。一个被async修饰的方法称为异步方法。
  • await: 用于等待异步操作完成。它只能在async方法中使用。

使用asyncawait的基本步骤

  1. 定义异步方法: 使用async关键字定义一个异步方法。异步方法通常返回TaskTask<T>
  2. 调用异步方法: 在异步方法内部,使用await关键字调用另一个异步方法。
  3. 从异步方法返回: 异步方法可以返回void(不推荐),TaskTask<T>。对于返回值的异步方法,使用return关键字返回一个值。
编辑
2025-09-24
C#
00

摘要

在面向服务的系统中,各个子系统之间通常采用异步方式进行通信,例如订单系统与支付系统之间的通信,以及现实生活中你在餐厅点菜、下单、做事、上菜、吃饭的过程,这些都是异步的。异步的工作流可以同时进行,因此它能够提高效率。现在的扫码点餐就是一个很好的异步例子,它将顾客点餐与厨师制作菜品的过程分离,使得这两个过程可以同时进行,从而提高了效率。在同步的世界里,工作流简单易懂,但效率却非常低。

正文

现代应用程序广泛使用文件和网络 I/O。I/O 相关 api 传统上默认是阻塞的,导致用户体验和硬件利用率不佳,此类问题的学习和编码的难度也较大。而今基于 Task 的异步 API 和语言级异步编程模式颠覆了传统模式,使得异步编程非常简单,几乎没有新的概念需要学习。

异步代码有如下特点:

  • 在等待 I/O 请求返回的过程中,通过让出线程来处理更多的服务器请求。
  • 通过在等待 I/O 请求时让出线程进行 UI 交互,并将长期运行的工作过渡到其他 CPU,使用户界面的响应性更强。
  • 许多较新的 .net API 都是异步的。
  • 在 .NET 中编写异步代码很容易。