Asp.Net异步编程

写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog

随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到各种打着Asp.Net异步编程的口号,如何提高性能,如何提高吞吐率!

好多文章都说得不清楚,甚至是错误的.只看到了一些表象,混淆概念.希望这篇文章能够能够对一部分人理解Asp.net异步编程模型.

本文的重点是理解Asp.net异步如何提高吞吐率,提高性能.当然提高性能的不单是异步,有很多方式,多线程等等.

1基础知识,谈一个初学者不容易理解的基础知识,这个基础知识,很不基础的哦

先看这个代码

ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads);
ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);

Asp.net有二类线程,1类就是工作线程,另一类是IO线程,也有叫完成端口线程.简单说一下,工作线程:处理普通请求的线程,平常代码中运用得最多的线程.

这个线程是有限的,是根CPU的个数相关的.IO线程,就是比如与文件读写,网络操作等就可以异步实现真正意义的性能提升[异步].

这个IO线程如果没有专门处理,通常情况下也是没有处理的,这个IO线程基本上都是空闲的

就是可以使用IO线程来代替工作线程,因为处理用户请求的是工作线程,是有限的,比较珍贵的。

2ThreadPool,Task这二个其实都是线程,对于Asp.net来说,代码没有做特殊的处理通常都是工作线程,线程池里的线程

Thread这个是底层的线程,没有做任何封装,直接使用,创建这个线程比较费时,同时不容易重用.

3async/await一个新的语法糖,一个简化方式的异步编程模型,值得推荐.有了这个后,我们的异步编程模型变得简单,优雅--这个和Task关系很紧密的,如何...自己去实践

以上几个概念了解后,我们就是使用最佳实践,提高性能,吞吐率了

下面给出一个WebApi的示例

        public async Task<string> Get()
{
return await GetArticleContentAsync();
} private async Task<string> GetArticleContentAsync()
{
using (var httpClient = new HttpClient())
{
var response = await httpClient.GetAsync("http://www.asp.net");
var buffer = await response.Content.ReadAsByteArrayAsync();
return Encoding.UTF8.GetString(buffer);
}
}

这个代码,看起来和网上其他的Blog差不多,但这样的方式对于asp.net异步,提升吞吐率的效果是最佳的,第1,使用IO端口,在处理网络请求的时候[从http://www.asp.net获取数据的时候]

把当时处理的工作线程返回给了线程池,让其可以处理其他用户的请求,在从网络www.asp.net获取数据的时候,只占用了一个IO线程

现在列出,网上其他Blog的关于这块的

 public async Task<string> GetArticleContentByNoRigntWayAsync()
{
return await Task.Run(() =>
{
using (var client = new WebClient())
{
return client.DownloadString("http://www.asp.net");
}
});
}

这个代码看起来和上面的代码没有什么区别,但是这样代码和上面的第一种方式是有本质的区别,性能真的有提升吗?真的能提升吞吐率吗?好多开发也是这样使用的

我先在这儿给出答案,这样的方式[使用GetArticleContentByNoRigntWayAsync],是不太可能提升性能的,特别是在Asp.net环境中

这儿的确用于了异步,也用到了Task,线程池.仅仅用到了而已

想知道为什么没有提升性能,没有提高吞吐率,需要各位客观的支持

接着昨天没有说完的,继续说!

把同步方法封闭成异步,在Asp.net中只会占用线程池的线程池,同时也可能会造成线程间的切换,至于线程池的切换耗时不,我不清楚,但是已经在关注性能问题了,那我们就

应该避免线程切换,切换总比不切换耗时,对吧

我们要使用并行计算,我们直接使用使用同步,再加上几个Task就可以了,如果只有一个Task,又是同步,也没有必要.

所以对于我们使用言我总结一下

使用异步,就要使用IO线程,充分利用这个去完成操作

如果没有使用IO线程,就直接使用同步会更好

1异步+IO线程

2直接同步

3并行计算[充分利用CPU]  同步+二个以上的Task

 a并行期间吞吐率会下降,如果CPU有空闲的话,可以考虑自己实现一个线程池[使用Thread],通常不易写稳定

 b[建议]把ThreadPool的默认数量改大些,前提还是CPU有空闲的话

写在最后的话,这Blog有8人推荐,5人反对->文章还写得不够好啊,对不起大家了

今天起来,被编辑推荐了,心里还是很高兴的,第一次被编辑推荐啊.感谢大家的评论支持,不管是支持,还是反对的

要是DUDU跟我开过后门,把这文章成为精选就更....开玩笑的,哈哈

如果觉得还有点点价值的,请点右下角 推荐

Asp.Net异步编程-使用了异步,性能就提升了吗?的更多相关文章

  1. C# 异步编程2 EAP 异步程序开发

    在前面一篇博文记录了C# APM异步编程的知识,今天再来分享一下EAP(基于事件的异步编程模式)异步编程的知识.后面会继续奉上TPL任务并行库的知识,喜欢的朋友请持续关注哦. EAP异步编程算是C#对 ...

  2. php为什么需要异步编程?php异步编程的详解(附示例)

    本篇文章给大家带来的内容是关于php为什么需要异步编程?php异步编程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我对 php 异步的知识还比较混乱,写这篇是为了 ...

  3. Java 异步编程 (5 种异步实现方式详解)

    ​ 同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现@mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Comp ...

  4. C# 异步编程1 APM 异步程序开发

    C#已有10多年历史,单从微软2年一版的更新进度来看活力异常旺盛,C#中的异步编程也经历了多个版本的演化,从今天起着手写一个系列博文,记录一下C#中的异步编程的发展历程.广告一下:喜欢我文章的朋友,请 ...

  5. 异步编程:IAsyncResult异步编程模型 (APM)

    http://www.cnblogs.com/heyuquan/archive/2013/03/22/2976420.html

  6. Asp.Net异步编程

    Asp.Net异步编程-使用了异步,性能就提升了吗? Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出 ...

  7. C#与C++的发展历程第三 - C#5.0异步编程巅峰

    系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...

  8. 让我们再为C#异步编程Async正名

    本文版权归博客园和作者吴双本人共同所有.转载和爬虫必须在显要位置注明出处:http://www.cnblogs.com/tdws 半年前翻译了一系列很糟糕的异步编程文章,用异步的常用语来说:" ...

  9. 【憩园】C#并发编程之异步编程(三)

      写在前面 本篇是异步编程系列的第三篇,本来计划第三篇的内容是介绍异步编程中常用的几个方法,但是前两篇写出来后,身边的朋友总是会有其他问题,所以决定再续写一篇,作为异步编程(一)和异步编程(二)的补 ...

随机推荐

  1. Camstar Portal modeling user guid --WorkCenter workCell workStation的关系

    业务需求:如何让用户登陆时选择  生产线(如:SMT生产线) Operation(如:维修员)  工作单元(如:印刷段) 工作站(如:上板) 关系图: 从上图可以看出: workCell是Resour ...

  2. linux 程序管理与SElinux

    此文涉及的命令:&.jobs.fg.bg.kill.nohup.ps.top.pstree.free.uname.uptime.netstat.dmesg.vmstat.fuser.lsof. ...

  3. js自定义对象

    一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascrip ...

  4. java中的条件语句(if、if...else、多重if、嵌套if)

    Java条件语句之 if 生活中,我们经常需要先做判断,然后才决定是否要做某件事情.例如,如果考试成绩大于 90 分,则奖励一个 IPHONE 5S .对于这种"需要先判断条件,条件满足后才 ...

  5. 转载:align

    1. 原理    int a;    int size = 8;        <----> 1000(bin)计算a以size为倍数的下界数:    就让这个数(要计算的这个数)表示成二 ...

  6. 学习varnish随笔

    Varnish是一款高性能.开源的反向代理服务器和缓存服务器.Varnish使用内存缓存文件来减少响应时间和网络带宽消耗.这个项目是由挪威的一家报纸Verdens Gang的网络分支起始的,其架构设计 ...

  7. effetive C++ 02 尽量以const,enum,inline替换#define

    #define ASPECT_RATIO=1.1const double AspectRatio=1.1 1. 使用宏会导致预处理器把程序代码中的ASPECT_RATIO无条件替换为1.1,编译器从未 ...

  8. 韩服LOL

    ※◆☆★☆◆※欢迎使用韩服LOL辅助,如有疑问请联系作者QQ:82850696*2*测试版已停用*1*2014-8-27 14:05:59*哈密*E2873D0137C6D04F42E088AA46E ...

  9. 【转】js判断手机访问网页

    原理:原理有两个,第一:通过游览器(browser)判断是否是手机:第二:通过访问终端判断是否是手机(userAgent):但是通常考虑到兼容性,需要这两种原理同时使用:具体的实现如下: JS实现: ...

  10. .net中从GridView中导出数据到excel(详细)

    1,创建数据源 找到要导出的GridView中的数据. 2,重写VerifyRenderingInServerForm方法. public override void VerifyRenderingI ...