C# 中的Async 和 Await 的用法详解

article/2025/9/14 8:37:23

1
众所周知C#提供Async和Await关键字来实现异步编程。在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await。
写在前面
自从C# 5.0时代引入async和await关键字后,异步编程就变得流行起来。尤其在现在的.NET Core时代,如果你的代码中没有出现async或者await关键字,都会让人感觉到很奇怪。

想象一下当我们在处理UI和按钮单击时,我们需要运行一个长时间运行的方法,比如读取一个大文件或其他需要很长时间的任务,在这种情况下,整个应用程序必须等待这个长时间运行的任务完成才算完成整个任务。

换句话说,如果同步应用程序中的任何进程被阻塞,则整个应用程序将被阻塞,我们的应用程序将停止响应,直到整个任务完成。

在这种情况下,异步编程将非常有用。通过使用异步编程,应用程序可以继续进行不依赖于整个任务完成的其他工作。

在Async 和 await关键字的帮助下,使得异步编程变得很简单,而且我们将获得传统异步编程的所有好处
2
实例讲解
假设我们分别使用了两种方法,即Method 1和Method 2,这两种方法不相互依赖,而Method 1需要很长时间才能完成它的任务。在同步编程中,它将执行第一个Method 1,并等待该方法的完成,然后执行Method 2。因此,这将是一个时间密集型的过程,即使这两种方法并不相互依赖。

我们可以使用简单的多线程编程并行运行所有方法,但是它会阻塞UI并等待完成所有任务。要解决这个问题,我们必须在传统编程中编写很多的代码,但是现在我们有了Async 和 await关键字,那么我们将通过书写很少的并且简洁的代码来解决这个问题。

此外,我们还将看到更多的示例,如果任何第三个方法(如Method 3)都依赖于Method 1,那么它将在Wait关键字的帮助下等待Method 1的完成。

Async 和 await是代码标记,它标记代码位置为任务完成后控件应该恢复的位置。
3
下面让我们举几个例子来更好进行理解吧

C#中Async 和 await关键字的示例

我们将采用控制台应用程序进行演示。
在这个例子中,我们将采取两个不相互依赖的方法。

class Program
{
static void Main(string[] args)
{
Method1();
Method2();
Console.ReadKey();
}

public static async Task Method1()
{  

await Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine(" Method 1");
}
});
}

public static void Method2()
{  for (int i = 0; i < 25; i++){  

Console.WriteLine(" Method 2");
}
}
}
在上面给出的代码中,Method 1和Method 2不相互依赖,我们是从主方法调用的。

在这里,我们可以清楚地看到,方法1和方法2并不是在等待对方完成。
在上面给出的代码中,Method 1和Method 2不相互依赖,我们是从主方法调用的。

在这里,我们可以清楚地看到,方法1和方法2并不是在等待对方完成。

输出
在这里插入图片描述
现在来看第二个例子,假设我们有Method 3,它依赖于Method 1
第二个例子
在本例中,Method 1将总长度作为整数值返回,我们在Method 3中以长度的形式传递一个参数,它来自Method 1。

在这里,在传递Method 3中的参数之前,我们必须使用AWAIT关键字,为此,我们必须使用调用方法中的async 关键字。

在控制台应用程序的Main方法中,因为不能使用async关键字而不能使用await 关键字,因为它会给出下面给出的错误。(但是如果你使用的是C#7.1及以上的方法是不会有问题的,因为C#7.1及以上的语法支持Mian方法前加async)
在这里插入图片描述
我们将创建一个新的方法,作为CallMethod,在这个方法中,我们将调用我们的所有方法,分别为Method 1、Method 2和Method 3。

class Program
{
static void Main(string[] args)
{
callMethod();
Console.ReadKey();
}

public static async void callMethod()
{  

Task task = Method1();
Method2();
int count = await task;
Method3(count);
}

public static async Task<int> Method1()
{  int count = 0;

await Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine(" Method 1");
count += 1;
}
});
return count;
}

public static void Method2()
{  for (int i = 0; i < 25; i++){  

Console.WriteLine(" Method 2");
}
}

public static void Method3(int count)
{  

Console.WriteLine("Total count is " + count);
}
}
在上面给出的代码中,Method 3需要一个参数,即Method 1的返回类型。在这里,await关键字对于等待Method 1任务的完成起着至关重要的作用。
输出
在这里插入图片描述
第三个例子
.NET Framework4.5中有一些支持API,Windows运行时包含支持异步编程的方法。

在Async 和 await关键字的帮助下,我们可以在实时项目中使用所有这些,以便更快地执行任务。

包含异步方法的API有HttpClient, SyndicationClient, StorageFile, StreamWriter, StreamReader, XmlReader, MediaCapture, BitmapEncoder, BitmapDecoder 等。

在本例中,我们将异步读取大型文本文件中的所有字符,并获取所有字符的总长度。

class Program
{
static void Main()
{
Task task = new Task(CallMethod);
task.Start();
task.Wait();
Console.ReadLine();
}

static async void CallMethod()
{  string filePath = "E:\\sampleFile.txt";  

Task task = ReadFile(filePath);

Console.WriteLine(" Other Work 1");
Console.WriteLine(" Other Work 2");
Console.WriteLine(" Other Work 3");

    int length = await task;

Console.WriteLine(" Total length: " + length);

Console.WriteLine(" After work 1");
Console.WriteLine(" After work 2");
}

static async Task<int> ReadFile(string file)
{  int length = 0;

Console.WriteLine(" File reading is stating");
using (StreamReader reader = new StreamReader(file))
{
// Reads all characters from the current position to the end of the stream asynchronously
// and returns them as one string.
string s = await reader.ReadToEndAsync();

length = s.Length;
}
Console.WriteLine(" File reading is completed");
return length;
}
}
在上面给出的代码中,我们调用ReadFile方法来读取文本文件的内容,并获取文本文件中总字符的长度。

在sampleText.txt中,文件包含了太多的字符,因此读取所有字符需要很长时间。

在这里,我们使用异步编程从文件中读取所有内容,所以它不会等待从这个方法获得一个返回值并执行其他代码行,但是它必须等待下面给出的代码行,因为我们使用的是等待关键字,我们将对下面给出的代码行使用返回值。

int length = await task;
Console.WriteLine(" Total length: " + length);
随后,将按顺序执行其他代码行。

Console.WriteLine(" After work 1");
Console.WriteLine(" After work 2");
在这里插入图片描述
最后
在这里,我们必须了解非常重要的一点,如果我们没有使用await 关键字,那么该方法就作为一个同步方法。编译器将向我们显示警告,但不会显示任何错误。
像上面这种简单的方式一样,我们可以在C#代码中使用async 和await关键字来愉快的进行异步编程了。
最后的最后感谢大家的阅读!
本文大部分内容翻译自:https://www.c-sharpcorner.com/article/async-and-await-in-c-sharp/


http://chatgpt.dhexx.cn/article/Zd5Vnu4i.shtml

相关文章

async、await

词法定义 async async 是“异步”的简写&#xff0c; async 用于申明一个异步的 function await await 可以认为是 async wait 的简写&#xff0c;await 用于等待一个异步方法执行完成。 借检https://www.cnblogs.com/airen123/p/9543490.html 特点&#xff1a; asayc的用…

C# 彻底搞懂async/await

关键&#xff1a; 异步方法&#xff1a;在执行完成前立即返回调用方法&#xff0c;在调用方法继续执行的过程中完成任务。 async/await 结构可分成三部分&#xff1a; &#xff08;1&#xff09;调用方法&#xff1a;该方法调用异步方法&#xff0c;然后在异步方法执行其任务的…

async、await总结

一、async用法 async作为一个关键字放到函数前面&#xff0c;用于表示函数是一个异步函数。异步函数也就意味着该函数的执行不会阻塞后面代码的执行。 异步函数语法很简单&#xff0c;就是在函数前面加上async 关键字&#xff0c;来表示它是异步的。 那怎么调用呢&#xff1f;a…

async和await

async和await 概念 先从字面意思来理解。async 是“异步”的简写&#xff0c;而 await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的&#xff0c;而 await 用于等待一个异步方法执行完成。 另外还有一个很有意思的语法规定&#xff0…

被说一知半解,await不懂你别乱用

文章目录 1.前言2.await是否阻塞主线程&#xff1f;3.await是否同步&#xff1f;4.总结 1.前言 这篇文章我是不想写的&#xff0c;因为之前已经写过了&#xff08;异步回调Async Await与Promise区别&#xff09;&#xff0c;此时此刻的心情是非常的不满&#xff0c;为什么呢&a…

async、await详解

一、async/await是什么&#xff1f; 简而言之&#xff0c; async用于申明一个function是异步的&#xff1b; 而await则可以认为是 async await的简写形式&#xff0c;是等待一个异步方法执行完成的。 二、async和await的基础使用 async/awiat的使用规则: async 表示这是一个a…

理解异步函数async和await的用法

定义 1. async 是异步的意思&#xff0c;await则可以理解为 async wait。所以可以理解async就是用来声明一个异步方法&#xff0c;而 await是用来等待异步方法执行 2. async作为一个关键字放在函数前面&#xff0c;表示该函数是一个异步函数&#xff0c;异步函数意味着该函数的…

(一)概述:NGS测序在病原微生物检测中的应用

❝ NGS 技术在临床上的应用逐步趋于成熟&#xff0c;从早期的肿瘤基因检测&#xff0c;到如今大热的微生物病原核酸检测&#xff0c;NGS 技术以其快速、准确和高分辨率的特点&#xff0c;发挥着无可替代的作用。 ❞ 微生物在地球上无处不在&#xff0c;从陆地到海洋&#xff0c…

肿瘤NGS测序公司生信工程师水平划分

生信工程师能力划分 1、大头兵&#xff08;1&#xff09;初级生信工程师工作职责任职要求 &#xff08;2&#xff09;中级生信工程师工作职责任职要求 &#xff08;3&#xff09;高级生信工程师工作职责任职要求 2、主管/经理职位描述任职要求 3、总监参考资料&#xff1a; 去年…

NGS数据分析实践:04. 准备测序数据

NGS数据分析实践&#xff1a;04. 准备测序数据 文接上篇&#xff1a;NGS数据分析实践&#xff1a;03. 涉及的常用数据格式[5] - vcf格式 本次NGS数据&#xff0c;采用多重PCR靶向扩增子测序技术&#xff0c;在Illunima Hiseq X Ten测序平台上进行双末端&#xff08;paired-end…

NGS_panel的CAP认证学习笔记

对于基因的定义总体可以划分为两类 GAD: Gene associated with Mendelian disorder; GADs include genes that meet criteria for definitive, strong, or moderate evidence for association with disease as described by ClinGenGUS: Gene of uncertain significance; GUSs …

45万例患者基因检测显示:NGS很难检测出七分之一的致病变异

基于下一代测序&#xff08;NGS&#xff09;的临床基因测试越来越多地用于辅助诊断&#xff0c;针对该技术的临床应用有具体的指南&#xff0c;除了检测相对可靠的单核苷酸变异&#xff08;SNVs&#xff09;和微小插入缺失&#xff08;indel&#xff09;&#xff0c;NGS也已经被…

R实战 | NGS数据时间序列分析(maSigPro)

masigpro 跟着Cell学作图 | 6.时间序列分析(Mfuzz包) 一个答疑教程。 maSigPro 流程 示例数据 #BiocManager::install(maSigPro) library(maSigPro) # 载入示例数据 data(data.abiotic) data.abiotic[1:5,1:5] data(edesign.abiotic) head(edesign.abiotic) > data.abiotic…

NGS数据分析实践:03. 涉及的常用数据格式[5] - vcf格式

NGS数据分析实践&#xff1a;03. 涉及的常用数据格式[5] - vcf格式 6. vcf格式6.1 vcf格式整体描述6.2 第8列INFO详解6.3 第9列FORMAT详解6.4 vcf文件简单解读 系列文章&#xff1a; 二代测序方法&#xff1a;DNA测序之靶向重测序 NGS数据分析实践&#xff1a;00. 变异识别的基…

生信小白学习日记Day4Day5——NGS基础 NGS分析注释(BWA软件)

2019年5月30日&#xff0c;晚上&#xff0c;心情变好&#xff0c;好几天没更新了&#xff0c;看到男朋友在学一款软件&#xff0c;我也近朱者赤&#xff0c;来继续注释Day2-2中NGS分析流程中的一个重要软件——BWA NGS基础 NGS分析注释 BWA 对应于NGS分析流程的这两步&…

NGS数据分析实践:00. 变异识别的基本流程

NGS数据分析实践&#xff1a;00. 变异识别的基本流程 变异识别过程可以分成3大块&#xff1a;1. 原始数据质控&#xff1b;2. 数据预处理&#xff1b;3. 变异识别。大致可以细分为6个部分&#xff1a;(1) 原始测序数据的质控&#xff1b;(2) read比对&#xff0c;排序和标记PCR…

如何用软件模拟NGS数据

如何用软件模拟NGS数据 为了评价一个工具的性能&#xff0c;通常我们都需要先模拟一批数据。这样相当于有了参考答案&#xff0c;才能检查工具的实际表现情况。因此对于我们而言&#xff0c;面对一个新的功能&#xff0c;可以先用模拟的数据测试下不同工具的优缺点。有如下几个…

生信小白学习日记Day2——NGS基础 illumina高通量测序原理

2019年5月26日&#xff0c;周日&#xff0c;小雨 说明&#xff1a;阅读生信宝典和查阅文章的总结&#xff0c;原文请关注公众号生信宝典&#xff0c;参考的博文都附有链接&#xff0c;仅供参考。 生信宝典 NGS基础——高通量测序原理 本文介绍了测序文库构建原理、链特异性文…

NGS数据分析实践:05. 测序数据的基本质控 [2] - MultiQC

NGS数据分析实践&#xff1a;05. 测序数据的基本质控 [2] - MultiQC 2. MultiQC2.1 帮助信息及运行代码2.2 报告解读2.3 小结 文接上篇&#xff1a;NGS数据分析实践&#xff1a;05. 测序数据的基本质控 [1] - FastQC 2. MultiQC NGS技术的进步催生了新的实验设计、分析类型和极…

NGS数据分析实践:03. 涉及的常用数据格式[2] - sam/bam格式

NGS数据分析实践&#xff1a;03. 涉及的常用数据格式[2] - sam/bam格式 2. sam和bam格式 系列文章&#xff1a; 二代测序方法&#xff1a;DNA测序之靶向重测序 NGS数据分析实践&#xff1a;00. 变异识别的基本流程 NGS数据分析实践&#xff1a;01. Conda环境配置及软件安装 NGS…