Asp.Net异步编程
  随着。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;
  }
  });
  }
  这个代码看起来和上面的代码没有什么区别,但是这样代码和上面的第一种方式是有本质的区别,性能真的有提升吗?真的能提升吞吐率吗?好多开发也是这样使用的
  我先在这儿给出答案,这样的方式[使用GetArticleContentByNoRigntWayAsync],是不太可能提升性能的,特别是在Asp.net环境中
  这儿的确用于了异步,也用到了Task,线程池。仅仅用到了而已
  想知道为什么没有提升性能,没有提高吞吐率,需要各位客观的支持
  接着昨天没有说完的,继续说!
  把同步方法封闭成异步,在Asp.net中只会占用线程池的线程池,同时也可能会造成线程间的切换,至于线程池的切换耗时不,我不清楚,但是已经在关注性能问题了,那我们就
  应该避免线程切换,切换总比不切换耗时,对吧
  我们要使用并行计算,我们直接使用使用同步,再加上几个Task就可以了,如果只有一个Task,又是同步,也没有必要。
  所以对于我们使用言我总结一下
  使用异步,就要使用IO线程,充分利用这个去完成操作
  如果没有使用IO线程,就直接使用同步会更好
  1异步+IO线程
  2直接同步
  3并行计算[充分利用CPU] 同步+二个以上的Task
  a并行期间吞吐率会下降,如果CPU有空闲的话,可以考虑自己实现一个线程池[使用Thread],通常不易写稳定
  b[建议]把ThreadPool的默认数量改大些,前提还是CPU有空闲的托福答案

Asp.Net使用异步性能就提升吗的更多相关文章

  1. Asp.Net异步编程-使用了异步,性能就提升了吗?

    Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到 ...

  2. 8 种提升 ASP.NET Web API 性能的方法

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  3. 六种简单方法提升ASP.NET Web API性能

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  4. 8种提升ASP.NET Web API性能的方法

    英文原文:8 ways to improve ASP.NET Web API performance ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没 ...

  5. [转载]8 种提升 ASP.NET Web API 性能的方法

    http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance 英文原文:8 ways to improve A ...

  6. 8 种提升 ASP.NET Web API 性能的方法 (转)

    出处:http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance ASP.NET Web API 是非常棒的 ...

  7. 8 种提升ASP.NET Web API性能的方法

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  8. 提高 ASP.NET Web 应用性能

    转载:http://www.codeceo.com/article/24-ways-improve-aspnet-web.html 在这篇文章中,将介绍一些提高 ASP.NET Web 应用性能的方法 ...

  9. 性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧

    性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对 ...

随机推荐

  1. poj 2253 Frogger【最小生成树变形】【kruskal】

    Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30427   Accepted: 9806 Descript ...

  2. ASP.NET中的文件上传大小限制的问题

    一.文件大小限制的问题 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文 ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言)

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言) 我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决 ...

  4. Git学习(一) 版本号管理工具

    Git 是一个分布式版本号控制工具.它的作者 Linus Torvalds 是这样给我们介绍 Git  -- The stupid content tracker(傻瓜式的内容跟踪器) 1. Git ...

  5. gitlab hooks

    之前一直用文件同步工具进行两台服务器之间的同步 最初的目的是吧gitlab的代码库同步到开发环境中运行 实时的 ,后来由于gitlab的代码仓库的代码不是实时的 于是在即使同步不适合 我的需求. 后来 ...

  6. [RxJS] Filtering operators: throttle and throttleTime

    Debounce is known to be a rate-limiting operator, but it's not the only one. This lessons introduces ...

  7. [RxJS + AngularJS] Sync Requests with RxJS and Angular

    When you implement a search bar, the user can make several different queries in a row. With a Promis ...

  8. android 06 LinearLayout

    xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:la ...

  9. 解决error:could not open ...jvm.cfg

    出现error:could not open '...jvm.cfg'大多是以前安装jdk或者jre的时候在注册表里注册过,现在安装的文件夹不在或者换了名字,有很多解决方法,最简单的一招是删除java ...

  10. 第九章------HAL

    HAL是建立在Linux驱动之上的的程序库,他是一个应用层,它的作用保护内部私有.有一种是位于Android层次的系统运行库层,Linux中只保留与寄存器相互的代码,通过HAL进行数据的传递. 为An ...