• Asp.Net异步编程


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

    Asp.Net异步编程

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

    随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到各种打着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,线程池.仅仅用到了而已

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

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

  • 相关阅读:
    P3383 【模板】线性筛素数
    POJ2431-Expedition【优先队列+贪心】
    HDU1087
    HDU1029
    最小生成树之Kruskal算法
    AC自动机模板
    328闯关解析
    php可获取客户端信息
    $( ).focus()与$( )[0].focus()区别
    RegExp类型和text()方法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3728938.html
Copyright © 2020-2023  润新知