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

C# async/await的使用

C# 中的 async 和 await 关键字是用于实现异步编程的重要工具,它们简化了编写和维护非阻塞代码的过程。以下是对这两个关键字用法的简要说明:

async 关键字

  • 定义异步方法:在方法声明前使用 async 关键字,表示该方法是一个异步方法。它通常会返回一个 Task 或 Task<T> 类型(对于有返回值的方法)。
public async Task<int> GetAsyncResultAsync()
{
    // ...
}

await 关键字

  • 等待异步操作完成:在异步方法内部,当你需要等待一个异步操作(如网络请求、文件读写等)完成时,可以对返回 Task 或 Task<T> 的调用使用 await 关键字。
public async Task<int> GetAsyncResultAsync()
{
    var result = await SomeAsynchronousOperation();
    // 当SomeAsynchronousOperation()完成时,控制流将返回到这里继续执行。
    return result;
}

private async Task<int> SomeAsynchronousOperation()
{
    // 这里模拟一个耗时的操作...
    await Task.Delay(1000); // 延迟1秒
    return 42; // 返回结果
}

行为特点

  1. 当遇到 await 表达式时,当前方法(称为awaiter方法)会暂停执行,并立即返回一个未完成的 Task 给调用者。这意味着调用者不会被阻塞,而是可以继续执行其他任务。
  2. 然后,线程池中的线程会被释放回线程池,而不是被阻塞等待异步操作完成。
  3. 当异步操作完成后,系统会安排一个线程(可能是原来线程也可能是新获取的线程,取决于上下文是否可调度)来执行 await 后面的语句。
  4. 如果异步方法有返回值,最终的结果将会封装到 Task<T> 中。

注意点

  • 异步方法中不应包含阻塞性操作,因为这样会浪费异步带来的性能优势。
  • 异步方法默认不会启动任何操作,直到该方法被调用并await其返回的任务。
  • 使用async/await时,应尽量避免嵌套过多层,以保持代码简洁且易于理解。
  • async关键字用于标记异步方法,await用于等待异步操作的完成。
  • 使用await时,需要确保等待的操作是返回TaskTask的子类。
  • 异步方法中可以使用try/catch块来处理异常。
  • 避免在异步方法中使用阻塞操作,例如Thread.Sleep,因为它会阻塞整个线程。

通过这种方式,C# 的 async 和 await 能够帮助开发者编写出高效、响应性好的应用程序,特别是在处理I/O密集型操作时。可以使异步代码更加清晰和易于理解,提高程序的性能和响应性。

注意:使用asyncawait时,要确保不要在非异步方法中使用它们,否则编译器会报错。

同样,如果一个异步方法不使用await来调用另一个异步方法,那么这个方法就不是真正意义上的异步方法,因为它会立即执行并完成,而不是等待内部的异步操作完成。

 


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

相关文章:

  • 使用Python和BeautifulSoup进行网页抓取:通过Python编程语言,结合BeautifulSoup库,可以轻松地从网站上抓取所需的信息。
  • 中信建投张青:以金融巨擘之姿,铸就公益慈善新篇章
  • AWTK-WIDGET-WEB-VIEW 实现笔记 (4) - Ubuntu
  • LeetCode --- 143周赛
  • UE5运行时创建slate窗口
  • 【网络安全】网络安全防护体系
  • Java微服务学习Day1
  • facebook广告投流有几种方式
  • XSS攻击 - 不要再硬背了
  • svg基础(五)滤镜-高斯模糊,混合模式,偏移,颜色变换
  • [C/C++] -- JSON for Modern C++
  • Centos 内存和硬盘占用情况以及top作用
  • JVM 性能调优 - 参数基础(2)
  • Java实现批量视频抽帧2.0
  • 前端架构: 脚手架的开发流程和常用框架
  • 基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟实践技术
  • macOS系统下彻底删除应用程序和其数据、配置等
  • 《Git 简易速速上手小册》第1章:Git 基础(2024 最新版)
  • Python进阶----在线翻译器(Python3的百度翻译爬虫)
  • get通过发送Body传参-工具类
  • Go 语言中如何大小端字节序?int 转 byte 是如何进行的?
  • 小白水平理解面试经典题目LeetCode 21. Merge Two Sorted Lists【Linked List类】
  • 【Web - 框架 - Vue】随笔 - 通过`CDN`的方式使用`VUE 2.0`和`Element UI`
  • CDN相关和HTTP代理
  • nodejs将console.log保存到log.txt文档中(electron工具)
  • 图像处理入门:OpenCV的基础用法解析