当前位置: 首页 > article >正文

C# 中await和async的用法(二)

3. async的返回值

在 C# 中,async 方法的返回值是与普通方法不同的,这是因为 async 方法是异步的,它允许在后台执行任务并在完成时返回结果。通常它会返回一个 TaskTask<T> 类型,而不是直接的值。

C# 中的 async 方法通常有以下几种返回类型:

  • Task:用于没有返回值的异步操作。
  • Task<T>:用于返回 T 类型的异步操作。
  • ValueTask<T>:用于性能优化的异步操作,类似于 Task<T>,但它减少了堆分配开销,适用于异步操作迅速完成的情况。
  • void:不推荐,如果没有返回值,可以用Task。
a. async 方法返回 Task

如果 async 方法没有返回值,通常返回 Task,表示该方法是异步执行的,并且不会返回任何数据。可以通过await等待异步执行完成,也可以对Task的执行情况进行判断,并可以使用try-catch来捕捉异常。

示例:

public async Task FetchDataAsync()

{

// 模拟异步操作

await Task.Delay(1000);

// 模拟一个异步操作

Console.WriteLine("数据获取成功!");

}

调用:

await FetchDataAsync(); // 等待异步任务完成

在这个例子中,FetchDataAsync 是一个返回 Task 的异步方法,它没有返回任何值,只是执行了一个异步操作(模拟延迟 1 秒)。

b. async 方法返回 Task<T>

如果 async 方法需要返回一个值(例如:计算结果、API 响应等),它应该返回 Task<T>,其中 T 是返回值的类型。Task<T> 表示一个异步任务,它会在执行完后返回一个值。

示例:

public async Task<int> AddAsync(int a, int b)

{

await Task.Delay(1000); // 模拟异步操作

return a + b;

}

调用:

int result = await AddAsync(3, 4); // result 的值是 7

Console.WriteLine(result); // 输出 7

在这个例子中,AddAsync 返回一个 Task<int>,它表示一个异步任务,任务完成时会返回两个整数之和。

c. async 方法返回 ValueTask<T>

ValueTask<T>Task<T> 的一种优化,尤其在一些非常快速完成的异步操作中,它避免了不必要的堆分配。在异步操作非常快速(例如缓存查找)并且性能要求较高时,ValueTask<T> 可以减少内存分配。

示例:

public async ValueTask<int> GetCachedDataAsync()

{

// 假设这里是一个快速的异步操作(比如从缓存中读取数据)

await Task.Delay(100); // 模拟异步操作

return 42;

}

调用:

 int result = await GetCachedDataAsync(); // result 的值是 42 Console.WriteLine(result); // 输出 42

虽然 ValueTask<T> 适用于性能要求较高的场景,但它的使用需要更小心,因为它不适合用在每个异步方法中。

d. async 方法返回 void

async 方法也可以返回 void,但是无法使用await等待这个任务完成,这种用法通常只推荐用于事件处理程序(event handlers)或其他不返回值的回调。不推荐在常规异步方法中使用 async void,因为如果异步方法抛出异常,无法通过 await 捕获异常,且无法获取任务的结果。

示例:

public async void HandleClickAsync(object sender, EventArgs e)

{

await Task.Delay(1000); // 模拟异步操作

Console.WriteLine("Button clicked!");

}

调用:

HandleClickAsync();//不可以等待这个方法完成

注意:

  • async void 方法的异常处理较为困难,不能通过 await 捕获异常。
  • 在大多数情况下,建议使用 async Taskasync Task<T> 来替代 async void
总结:async 方法的返回类型
  • Task:没有返回值的异步方法(适用于执行一些任务而不需要返回结果)。
  • Task<T>:返回值的异步方法,其中 T 是返回的类型。
  • ValueTask<T>:优化过的 Task<T>,用于性能敏感的场景。
  • async void:仅用于事件处理程序等特殊场景,不推荐用于普通的异步方法。

4. async 方法的返回值与 await 配合使用

await 用于等待 TaskTask<T> 类型的结果。如果是返回 Task 的异步方法,您无需获取返回值;如果是返回 Task<T> 的方法,await 会返回 T 类型的结果。

示例:异步方法返回 Task<T>await 使用

 public async Task<int> MultiplyAsync(int a, int b)

{

await Task.Delay(1000); // 模拟异步操作

return a * b;

}

// 调用异步方法并获取返回值

public async Task Run()

{

int result = await MultiplyAsync(3, 4); // 获取返回值 12

Console.WriteLine(result); // 输出 12

}

在这个示例中,MultiplyAsync 返回一个 Task<int>,而 await MultiplyAsync(3, 4) 会等待任务完成并获取返回的整数 12

总结:
  • async 方法的返回类型通常是 TaskTask<T>
  • 如果没有返回值,返回 Task;如果有返回值,返回 Task<T>
  • 在需要优化性能时,可以使用 ValueTask<T>
  • async void 主要用于事件处理程序或回调方法,通常不推荐在其他场景使用。

理解 async 方法的返回值对于编写有效的异步代码非常重要,可以帮助你正确地处理异步操作和任务。


http://www.kler.cn/a/472954.html

相关文章:

  • Linux服务器网络不通问题排查及常用命令使用
  • 使用WPF在C#中制作下载按钮
  • Flask返回浏览器无乱码方法
  • thinkphp6.0常用设计模式实例
  • Pytorch初学
  • PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它
  • y7000p2023AX211ubuntu20无线网卡驱动
  • 【人工智能计算机视觉】——深入详解人工智能计算机视觉之图像处理之基础图像处理技术
  • UE 5.3 C++ 管理POI 如何对WidgetComponent 屏幕模式进行点击
  • 详述 VScode wkhtmltopdf 实现 markdown 转带目录标签(导航栏)的 PDF
  • k8s里面etcd的作用
  • 后端Java开发:第十二天
  • AI大模型-提示工程学习笔记4
  • 【实用技能】如何使用 .NET C# 中的 Azure Key Vault 中的 PFX 证书对 PDF 文档进行签名
  • 【UE5 C++课程系列笔记】24——多线程基础——Async
  • MySQL - 子查询和相关子查询详解
  • 低代码平台的集成与扩展性详解
  • 【DevOps工具篇】 SonarQube详解
  • Python Json格式数据处理
  • Swift语言的网络编程
  • cp命令详解
  • JAVA学习-练习试用Java实现“从用户输入获取一个字符串,并使用replace方法将字符串中的所有空格替换为下划线”
  • 深度学习中的卷积和反卷积(一)——卷积的介绍
  • client-go中watch机制的一些陷阱
  • EntityFrameworkCore 跟踪查询(Tracking Queries)
  • 转移指令jmp以及其他转移指令