程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 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,線程池.僅僅用到了而已

作者:cnblogs rosanshao

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved