首页 > 编程语言 >C# Async,Await简单理解(应用层次)

C# Async,Await简单理解(应用层次)

时间:2023-04-18 16:56:33浏览次数:58  
标签:stopwatch C# Await new stopwatch1 static async Stopwatch Async


这里我就不给大家去研究这两上下文关键字的il实现了,感兴趣的朋友可以自己去用ildasm分析一下。
我写这篇文章只是想强调微软官方文档上写的一点:

 

async和await并没有开辟新的线程,我们来分别执行一下io密集型和cpu密集型代码

 

static void Main(string[] args){
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
GetUrlContentLengthAsync();
stopwatch.Stop();
Console.WriteLine("async,await时间: " + stopwatch.ElapsedMilliseconds);

Stopwatch stopwatch1 = new Stopwatch();
stopwatch1.Start();
GetUrlContentLength();
stopwatch1.Stop();
Console.WriteLine("非async,await时间: " + stopwatch1.ElapsedMilliseconds);
}

public async static Task<int> GetUrlContentLength()
{
var client = new HttpClient();

string getStringTask =
client.GetStringAsync("https://learn.microsoft.com/dotnet").ToString();

DoIndependentWork();

string contents = getStringTask;

return contents.Length;
}

public async static Task<int> GetUrlContentLengthAsync()
{
var client = new HttpClient();

Task<string> getStringTask =
client.GetStringAsync("https://learn.microsoft.com/dotnet");

DoIndependentWork();

string contents = await getStringTask;

return contents.Length;
}

static void DoIndependentWork()
{
Console.WriteLine("Working...");
}

运行结果:

 

这是io密集型,就是微软官方文档的示例代码
为什么用了这个反而更慢?我理解的是因为存在上下文状态的切换。
可能我这样说不是很直观,我推荐阅读微软原文档:
https://learn.microsoft.com/zh-cn/dotnet/csharp/asynchronous-programming/task-asynchronous-programming-model?source=recommendations

我们再来看一个cpu密集型操作:

static void Main(string[] args){
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
GetnumAsync();
stopwatch.Stop();
Console.WriteLine("async,await时间: " + stopwatch.ElapsedMilliseconds);

Stopwatch stopwatch1 = new Stopwatch();
stopwatch1.Start();
Getnum();
stopwatch1.Stop();
Console.WriteLine("主线程时间: " + stopwatch1.ElapsedMilliseconds);
}
public async static Task<int> GetnumAsync()
{
int num = 0;
await Task.Run(() =>
{
for (int i = 0; i < 100000000; i++)
{
num += i;
}
});

return num;
}

public static int Getnum()
{
Stopwatch stopwatch1 = new Stopwatch();
stopwatch1.Start();
int num = 0;
for (int i = 0; i < 100000000; i++)
{
num += i;
}
stopwatch1.Stop();
Console.WriteLine("子线程时间: " + stopwatch1.ElapsedMilliseconds);


return num;
}

  


运行结果如下:

 

此时,反而开辟了新线程,用时会更长,为什么呢?很简单,因为线程间的切换是需要资源的。
希望大家亲手实践一下我提供的这两例子,加深自己的映像。若有不对,请指正。

标签:stopwatch,C#,Await,new,stopwatch1,static,async,Stopwatch,Async
From: https://www.cnblogs.com/jyj666/p/17330235.html

相关文章

  • 发布三个月跳水超1000!苹果M2版Mac mini降到3478元了
    快科技4月18日消息,苹果在今年1月17日晚,在官网上架了新款的Macmini,搭载了M2芯片,起售价4499元。当时该产品配合上教育优惠,一度被认为是“香爆了”的产品,如今距离发布刚好三个月时间,其价格在电商平台却直接跳水千元。根据拼多多百亿补贴频道显示,苹果M2版Macmini如今售价只要3478......
  • window location跳转的几种方式与a链接跳转的总结
    1.window.location.href在当前页面跳转window.location.href='http://www.baidu.com'等于<ahref="http://www.baidu.com"></a>2.window.open在新页面跳转window.open('www.baidu.com')等于<ahref="http://www.baidu.com&qu......
  • Action 接受参数的3中方式(4)
    Action接受参数的3中方式1.继承ActionSupport的Action在Action中添加字段,这些字段的名字与参数的名字相同,并添加相应的setters与getters方法。packagecom.bjsxt.struts2.user.action;importcom.opensymphony.xwork2.ActionSupport;publicclassUserActionextendsActionSu......
  • log4j笔记之Category
    org.apache.log4j.CategoryThisclasshasbeendeprecatedandreplacedbytheLoggersubclass.Itwillbekeptaroundtopreservebackwardcompatibilityuntilmid2003.这个类已经被废弃并且被Logger的子类代替。它将将保留为了保持向后兼容性,直到2003年中期。 Logger......
  • Spring源码分析——BeanFactory体系之接口详细分析
    Spring的BeanFactory的继承体系堪称经典。这是众所周知的!作为Java程序员,不能错过!前面的博文分析了Spring的Resource资源类Resouce。今天开始分析Spring的IOC部分。众所周知,IOC是Spring框架最迷人的地方。它最重要的接口,就是BeanFactory了。BeanFactory有着庞大的继承、实现......
  • 分投趣(Fintoch)系统开发(详细及方案)
    什么是佛萨奇原力FORGE?佛萨奇原力FORCE是在链上部署的一个智能合约BSC智能链是基于全球第一交易所网的数字钱包智能链公链开发的一个独立公链。FORGE循环仪中使用的矩阵大小为3×1和2×2。3×1矩阵本质上很简单,只需要填充三个位置即可。2×2矩阵从第一层的两个位置开始,然后扩展......
  • GraphicsLayer 可以在一个图层上绘制多个的多边形
    ArcGISforJS的GraphicsLayer可以在一个图层上绘制多个的多边形¹。你可以使用Polygon类来创建多边形的几何对象,然后使用Graphic类来将几何对象和符号对象组合成图形对象,最后使用GraphicsLayer的add()方法或者addMany()方法来将图形对象添加到图层上。创建一个Graph......
  • Java并发编程:Lock
      在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来讨论这个问题,从Java5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提......
  • 分投趣Fintoch系统开发案例智能合约搭建
    在这个技术教程中,你会学习到怎样开发一个end-to-end的dApp。在dApp中,用户可以通过一个智能合约,获取和存储ETH的当前价格。这个教程demo代码存储在Github中。 编译之后,就可以部署到区块链上。 在migrations文件夹下已经有一个1_initial_migration.js部署脚本,用来部署Migrations.so......
  • electron项目进行打包
    背景介绍项目需要在内网环境的linux环境下对electron项目进行打包。获取package.json可以只用一个package.json在外网下载好需要的node_modules。在packag.json中配置好需要的依赖包,然后直接在package.json目录下npminstall即可下载所需要的依赖包。dependencies和devDependen......