国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Asp.Net異步編程-使用了異步,性能就提升了嗎?

2019-11-17 01:32:40
字體:
來源:轉載
供稿:網友

asp.net異步編程-使用了異步,性能就提升了嗎?

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跟我開過后門,把這文章成為精選就更....開玩笑的,哈哈

如果覺得還有點點價值的,請點右下角 推薦


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 五家渠市| 江西省| 永川市| 探索| 剑川县| 阿拉善盟| 庆城县| 云龙县| 公主岭市| 巍山| 东阳市| 民县| 景洪市| 吉木萨尔县| 油尖旺区| 黑河市| 云和县| 明光市| 历史| 临夏市| 张掖市| 丁青县| 铁力市| 兴和县| 茂名市| 阜新市| 独山县| 石景山区| 岱山县| 禹城市| 同仁县| 麦盖提县| 嘉定区| 兴文县| 洛隆县| 镇平县| 北海市| 玉环县| 梁河县| 台东市| 祁东县|