當前位置:編程學習大全網 - 源碼下載 - 為什麽 mvc4 asynccontroller不能異步執行

為什麽 mvc4 asynccontroller不能異步執行

對於HTTP的請求響應模型,服務器無法主動通知或回調客戶端,當客戶端發起壹個請求後,必須保持連接等待服務器的返回結果,才能繼續處理,因此,對於客戶端來說,請求與響應是無法異步進行,也就是說無論服務器如何處理請求,對於客戶端來說沒有任何差別。

那麽ASP.NET異步指的又是什麽,解決了什麽問題呢?

在解釋ASP.NET異步前,先來考察下ASP.NET線程模型。

ASP.NET線程模型

我們知道,壹個WEB服務可以同時服務器多個用戶,我們可以想象壹下,WEB程序應該運行於多線程環境中,對於運行WEB程序的線程,我們可以稱之為WEB線程,那麽,先來看看WEB線程長什麽樣子吧。

我們可以用壹個HttpHandler輸出壹些內容。

public class Handler : IHttpHandler{ public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; var thread = Thread.CurrentThread; context.Response.Write( string.Format("Name:{0}\r\nManagedThreadId:{1}\r\nIsBackground:{2}\r\nIsThreadPoolThread:{3}", thread.Name, thread.ManagedThreadId, thread.IsBackground, thread.IsThreadPoolThread) ); } public bool IsReusable { get {return true;} }} 妳可以看到類似於這樣的結果:

Name:

ManagedThreadId:57

IsBackground:True

IsThreadPoolThread:True

這裏可以看到,WEB線程是壹個沒有名稱的線程池中的線程,如果刷新這個頁面,還有機會看到 ManagedThreadId 在不斷變化,並且可能重復出現。說明WEB程序有機會運行於線程池中的不同線程。

為了模擬多用戶並發訪問的情況,我們需要對這個處理程序添加人為的延時,並輸出線程相關信息與開始結束時間,再通過客戶端程序同時發起多個請求,查看返回的內容,分析請求的處理情況。

public void ProcessRequest(HttpContext context){ DateTime begin = DateTime.Now; int t1, t2, t3; ThreadPool.GetAvailableThreads(out t1, out t3); ThreadPool.GetMaxThreads(out t2, out t3); Thread.Sleep(TimeSpan.FromSeconds(10)); DateTime end = DateTime.Now; context.Response.ContentType = "text/plain"; var thread = Thread.CurrentThread; context.Response.Write( string.Format("TId:{0}\tApp:{1}\tBegin:{2:mm:ss,ffff}\tEnd:{3:mm:ss,ffff}\tTPool:{4}", thread.ManagedThreadId, context.ApplicationInstance.GetHashCode(), begin, end, t2 - t1 ) );} 我們用壹個命令行程序來發起請求,並顯示結果。

static void Main(){ var url = new Uri("http://localhost:8012/Handler.ashx"); var num = 50; for (int i = 0; i < num; i++) { var request = WebRequest.Create(url); request.GetResponseAsync().ContinueWith(t => { var stream = t.Result.GetResponseStream(); using (TextReader tr = new StreamReader(stream)) { Console.WriteLine(tr.ReadToEnd()); } }); } Console.ReadLine();} 這裏,我們同時發起了50個請求,然後觀察響應的情況。

註意後面的結果會因為操作系統、IIS版本、管道模式、.NET版本、配置項 的不同而不同,以下結果為在Windows Server 2008 R2 + IIS7.5 + .NET 4.5 beta(.NET 4 runtime) + 默認配置 中測試的結果,在沒有特別說明的情況下,均為重啟IIS後第壹次運行的情況。

這個程序在我的電腦運行結果是這樣的:

  • 上一篇:我學的是會計專業,今年會計證還能考嗎?
  • 下一篇:如何利用php執行.sql文件php執行sql語句
  • copyright 2024編程學習大全網