net异步编程之await

时间:2022-12-18 20:25:39

net异步编程之await

初探asp.net异步编程之await

 

终于毕业了,也顺利进入一家期望的旅游互联网公司。27号入职。放肆了一个多月没写代码,好方啊。

另外一下观点均主要针对于await.

写在前面(带着问题学习)
一.根据代码和执行结果,初探异步编程的执行过程。

*问题1:await会让当前线程一直等待吗?await等待的时间中一直占用线程资源吗?

*问题2:等待await数据返回交给等待线程再继续向下执行吗?

*问题3:向await下一条语句执行的线程,是执行await的线程吗?

二.异步编程async,await的使用意义和适用场景。

*问题1:异步编程可以让程序变快吗?

*问题2:异步编程执行耗时计算有用吗?

*问题3:既然异步编程执行顺序和同步相同,那么其意义何在?

解惑一(初步结果)
测试代码
net异步编程之await
 class Program
{
static void Main(string[] args)
{
FirsTask();
Console.ReadLine();
}
public static async Task<string> FirsTask()
{
Console.WriteLine("1.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
var result = await SecondTask();
Console.WriteLine("6.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
return result;
}
public static async Task<string> SecondTask()
{
using (var client = new HttpClient())
{
Console.WriteLine("2.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
var result = await client.GetAsync(
"http://*.com/questions/37991851/jenkins-configure-page-not-loading-version1-651-3-chrome-browser");
await ThirdTask();
Console.WriteLine("5.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
return await result.Content.ReadAsStringAsync();
}
}
public static async Task<string> ThirdTask()
{
using (var client = new HttpClient())
{
Console.WriteLine("3.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
var result = await client.GetAsync(
"http://*.com/questions/37993657/managing-outgoing-calls-settings-in-skype-for-business-client-using-remote-power");
Console.WriteLine("4.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
return await result.Content.ReadAsStringAsync();
}
}
}
net异步编程之await
输出结果
net异步编程之await
net异步编程之awaitnet异步编程之awaitnet异步编程之await
net异步编程之await
net异步编程之await
输出结果说明了前三个问题:
  我们可以看到输出1和6,2和5,3和4往往不是相同的线程,但是也未必不是相同的线程。 事实证明,await不会让当前线程等待await的结果,继而由等待线程继续向下执行。 而是,遇到await时,当前线程会被释放到线程池。在await返回结果后,在调用任意空闲线程向下执行
解惑二(意义和用途)
  由于当前线程遇到await时会被释放到线程池不会在时间上的等待中占用线程资源。 事实也证明,我们当前异步代码的执行顺序和同步代码执行顺序是相同的,在这样的情况下,线程被释放就是可以被重复利用的。 这样的重要意义在于,iis中线程池线程数是有限的,如果当前可以并发一百个请求,在同步情况下, 那么一百个请求导致一百个线程都在等待中。但是在异步过程中,线程被释放了,阻塞等待的时间没有了,也就可以容纳更多的请求。 程序要向下执行,依然要等到await结果,所以说同步和异步的执行时间是一样的,不会因为异步而减少执行时间。

异步编程特别适用于网络操作,因为网络操作发起请求之后等待它完成就行,所以这时候执行到这的线程,可以释放并会到线程池中,网络操作执行完成之后,再从线程池中随机拿一个线程继续执行。

最后的补充:刚才讨论的是await的作用。之所以如上测试代码能够按照同步的过程来执行,是await的作用。比如我们在FirstTask中不等待SecondTask的结果时,那么执行顺序是会改变的,6会提前输出出来。这是async的作用,不阻塞线程。我个人认为,在不需要await结果的情况下,async是可以减少执行时间的。

 
分类: asp.net核心

net异步编程之await的更多相关文章

  1. 初探asp&period;net异步编程之await

    终于毕业了,也顺利进入一家期望的旅游互联网公司.27号入职.放肆了一个多月没写代码,好方啊. 另外一下观点均主要针对于await. 请先看这段话,来自async in C# 5.0.  接下来几个月的 ...

  2. python异步编程之asyncio

    python异步编程之asyncio   前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率, ...

  3. 异步编程之Generator&lpar;1&rpar;——领略魅力

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  4. 异步编程之Promise&lpar;3&rpar;:拓展进阶

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  5. 异步编程之Promise&lpar;2&rpar;:探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  6. &lpar;翻译&rpar;异步编程之Promise&lpar;1&rpar;:初见魅力

    原文:https://www.promisejs.org/ by Forbes Lindesay 异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2) ...

  7. Javascript异步编程之setTimeout与setInterval详解分析&lpar;一&rpar;

    Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程(注意:特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛 ...

  8. 异步编程之co——源码分析

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  9. 异步编程之Generator&lpar;2&rpar;——剖析特性

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

随机推荐

  1. PHP:Xdebug配置

    在配置Xdebug时,之前经历了无数次失败,终于配置成功! 以下是配置失败的原因: 1.下载时,选用Xdebug的版本不正确: 2.配置时,Xdebug文件名或文件的路径不正确: 在参考 http:/ ...

  2. Apache不重新编译,利用apxs工具给Apache添加模块,如cgi模块

    想实践下Apache是如何运行cgi程序的,却发现先前编译安装Apache的时候,没有安装Apache的cgi模块. 附:CentOS6.x编译安装LAMP(2):编译安装 Apache2.2.25 ...

  3. C&plus;&plus;调用约定和名字约定

    C++调用约定和名字约定 转自http://www.cppblog.com/mzty/archive/2007/04/20/22349.html 调用约定:__cdecl __fastcall与 __ ...

  4. ASP&period;NET MVC 表单提交List到Controller

    1.实体结构: 2.View代码: 3.controller代码: 参考链接:http://shiyousan.com/post/635383025861004585

  5. 真机测试INSTALL&lowbar;FAILED&lowbar;INSUFFICIENT&lowbar;STORAGE 的解决方法

    来源:http://blog.csdn.net/aikongmeng/article/details/9793809 INSTALL_FAILED_INSUFFICIENT_STORAGE 的解决方法 ...

  6. Android TextView内容过长加省略号,点击显示全部内容

    在Android TextView中有个内容过长加省略号的属性,即ellipsize,用法如下: 在xml中:android:ellipsize="end"    省略号在结尾an ...

  7. haproxy 服务端超时时间 timeout server 17000 --后台程序17秒没有响应&comma;返回超时

    haproxy 服务端超时时间: haproxy 配置: timeout server 17000 --后台程序17秒没有响应,返回超时 Jun 27 09:29:56 localhost hapro ...

  8. 错误提示 Unsupported compiler &&num;39&semi;com&period;apple&period;compilers&period;llvmgcc42&&num;39&semi; selected for architecture &&num;39&semi;i386&&num;39&semi;

    转自http://blog.csdn.net/cyuyanenen/article/details/51444974 警告提示:Invalid C/C++ compiler in target Cor ...

  9. Node&period;js初探

    1, 设计高性能.Web服务器的几个要点:事件驱动.非阻塞I/O 2,常见Web服务器架构: Web服务器的功能: 接受HTTP请求(GET.POST.DELETE.PUT.PATCH) 处理HTTP ...

  10. poj 3071 Football(概率dp)

    id=3071">http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率 ...