浅谈C#中await运算符在不同类型应用中的不同行为

这篇具有很好参考价值的文章主要介绍了浅谈C#中await运算符在不同类型应用中的不同行为。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

C#中的await运算符,因其不会阻塞主线程,可以给用户更好的操作体验,所以广泛的应用于各种C#的应用中。

本文主要分析其在Console程序,Winform程序和WebApi程序中,其工作行为的异同点,来更好的使用该运算符。

基本概念

await运算符的基本功能是挂起当前的async方法,并直到异步方法完成,并返回。

基本实现

挂起async方法最简单的方式就是将该方法放到一个新的线程中。

下面我们看一下await在不同应用中的基本行为:

Console

private static async Task doAsyncWork(){
    await Task.Delay(2000);
    PrintTreadNumber();
}
public static async Task  Main(string[] args)
{
    PrintTreadNumber();
    await doAsyncWork();
    PrintTreadNumber();
 }

运行结果如下:

Current Thread Id is 1
Current Thread Id is 4
Current Thread Id is 4

从运行结果可以看出,await运算符的出现,让runtime启动了一个新的线程处理异步方法和异步方法后面的代码。

Winfrom

private static async Task doAsyncWork(){
    await Task.Delay(2000);
    PrintTreadNumber();
}
 private async void  btn_Click (Object sender, EventArgs e){
    PrintTreadNumber();
    await doAsyncWork();
    PrintTreadNumber();
 }

运行结果如下:

Current Thread Id is 1
Current Thread Id is 1
Current Thread Id is 1

从Winform的运行来看,一直是UI主线程在处理异步任务,runtime并没有为await后面的异步任务启动新的线程。

如果用ConfigureAwait方法强行启动子线程,代码如下:

private static async Task doAsyncWork(){
    await Task.Delay(2000);
    PrintTreadNumber();
}
private async void  btn_Click (Object sender, EventArgs e){
    PrintTreadNumber();
    await doAsyncWork();
    PrintTreadNumber();
}
private async Task doAsyncWork(){
    await Task.Delay(2000).ConfigureAwait(false);
    PrintTreadNumber();
}

运行结果如下:

Current Thread Id is 1
Current Thread Id is 5
Current Thread Id is 1

从运行结果可以看出,UI线程在调用doAsyncWork时候,当执行到 await Task.Delay(2000).ConfigureAwait(false),runtime启动了子线程完成异步运算, 因为调用了ConfigureAwait(false), 因此启动了新的线程,符合预期。

btn_Click 作为button的响应函数,考虑到里面可能有很多的UI操作,所以该响应函数直接与UI线程相关联。doAsyncWork后面并没有调用ConfigureAwait(false),代码等价于 await doAsyncWork().ConfigureAwait(true),表示后面的代码和await的代码共用一个线程,所以最后一个PrintTreadNumber打印线程号是1,即UI主线程的线程号。

WebApi

await运算符在WebApi和Console中的行为基本一致,由于没有UI线程的限制,所以runtime会启动一个子线程来处理await操作符修饰的异步代码。文章来源地址https://www.toymoban.com/news/detail-603081.html

到了这里,关于浅谈C#中await运算符在不同类型应用中的不同行为的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JavaSE】数据类型和运算符

    从这一篇我们开始Java的学习~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 前言 Java第一个程序 字面常量 字面常量的分类 结合代码理解 类型转换 类型提升  byte与byte的运算 正确写法 字符串类型String int与String相互转换 int转String String转int 算

    2024年03月28日
    浏览(38)
  • JAVA——数据类型与运算符

    注意事项: 1.初始化操作是可选的, 但是建议创建变量的时候都显式初始化.                   2. 最后不要忘记分号, 否则会编译失败.                   3.初始化设定的值为 10L , 表示一个长整型的数字. 10l 也可以.                   4.float 类型在 Java 中占四个字节, 遵守

    2024年01月19日
    浏览(56)
  • JavaSE ---01 数据类型与运算符

    正所谓温故而知新,可以为师矣,虽然已经学过一遍javase,但是回头复习仍然能找到很多初学的时候遗忘的点,所以我们在学习的途中还是要保持空杯心态,这样才能走的更远, 切忌眼高手低 . 说到变量大家都经常去使用,那么什么是变量呢?下面给出变量的定义 变量指的是程序运行时

    2024年02月08日
    浏览(34)
  • Java数据类型,变量与运算符

    常量是在程序运行期间,固定不变的量称为常量。 在以上程序中,输出的Hello Word,其中的“Hello Word”就是字面常量。 字面常量的分类: 字符串常量 整形常量 浮点数常量 字符常量 布尔常量 空常量 注意:字符串,整形,浮点型,字符型以及布尔型,在Java中都称为数据类型

    2024年02月08日
    浏览(44)
  • Eclipse基本使用、数据类型、运算符

    Java专栏目录(点击进入…) 1.打开新建项目窗口(File -- New -- Project) 2.在New Project窗口中选择Java Project创建项目 3.在New Java Project对话框 Project name:项目名称 Project Layout项目布局:Create separate~~~(为源文件和类文件穿件单独的文件夹) 1.打开新建类窗口(File -- New -- Class) 名

    2023年04月18日
    浏览(39)
  • JavaSE-02【类型转换和运算符】

    自动转换:将取值范围小的类型自动提升为取回范围大的类型 案例:Demo01_DataType 强制类型转换:将取值范围大的类型,强制转换成取值范围小的类型 转换格式: 案例: 注意事项 1、算术运算符----四则与取模运算 2、算术运算符----加号的多种用法 3、案例 3、算术运算符---

    2024年02月08日
    浏览(38)
  • C++——类和对象3|日期类型|Cout运算符重载|Cin运算符重载|const成员|

    目录 日期类型  Date.h  Date.cpp  Test.cpp  实现Cout运算符重载  实现Cin运算符重载  根据日期算星期  修改后完整代码   Date.h  Date.cpp  const成员  取地址及const取地址操作符重载 习题  计算日期到天数转换     一个类到底可以重载哪些运算符,要看哪些运算符对这个类型有

    2023年04月13日
    浏览(49)
  • C# 扩展运算符(...)的详细解析

    在C#编程中,扩展运算符(…)是一种非常有用的特性,它可以将一个数组或集合转换成一个可迭代的序列。扩展运算符在C# 7.0及以后的版本中引入,提供了一种简洁的方式来创建数组、列表或集合的实例,尤其是在需要传递多个参数时。本文将详细介绍C#扩展运算符的概念、

    2024年04月22日
    浏览(68)
  • 8大基本类型的转换和运算符

       ​       byte----short----int----long----float----double    ​       char----      - 自动/隐式类型转换:小类型到大类型      - 强制类型转换:大类型到小类型        ​    语法:(要转换成为的数据类型)变量        ​    强转有可能溢出或丢失精度      - 两点规则:  

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包