Asp.Net异步编程
来源:互联网 发布:张北数据港招聘信息 编辑:程序博客网 时间:2024/05/17 08:59
Asp.Net异步编程
转载于:http://www.cnblogs.com/rosanshao/p/3728108.html
写在前面的话,很久没有写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异步编程
- ASP.NET中的异步编程
- ASP.NET中的异步编程
- Asp.Net异步页处理-NET编程
- ASP.NET MVC的异步编程
- c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作
- c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作
- 通过 ASP.NET 异步编程实现可扩展的应用程序
- 通过 ASP.NET 异步编程实现可扩展的应用程序
- 通过 ASP.NET 异步编程实现可扩展的应用程序
- asp.net异步页
- asp.net 异步页面
- ASP.NET异步处理
- ASP.NET异步加载
- 详解 ASP.NET异步
- 详解 ASP.NET异步
- asp.net异步页面
- 详解 ASP.NET异步
- android 6.0(api 23) SDK,不再提供org.apache.http.*解决方法。
- 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )
- ANDROID 一键搞定JNI创建C头文件
- std::auto_ptr 官网例子
- 第2周项目3—小试循环(2)
- Asp.Net异步编程
- solaris10上tomcat无法使用64位JVM
- Android触控基础:MotionEvent
- 【java项目实践】详解Ajax工作原理以及实现异步验证用户名是否存在(java版)
- Matlab 矩阵操作函数- reshape repmat permute squeeze flip
- 关于python subprocess的popen
- .Net网站架构设计(五) 消息中间件
- Sublime Text 3 设置移动光标快捷键
- 操作系统三个简单的部分(Operating Systems in Three Easy Pieces闲来无聊,翻译的)虚拟化部分-原文编号3对话