最近幾年,非同步程式設計受到極大關注,主要是出於兩個關鍵原因:首先,它有助於提供更好的使用者體驗,因為不會阻塞UI 線程,避免了處理結束前出現UI 介面掛起。其次,它有助於大幅擴展系統,而且無需添加額外硬體。
但是,編寫合適的非同步程式碼來管理執行緒本身是項乏味的工作。雖然如此,其巨大好處讓許多新舊技術紛紛開始使用非同步程式設計。微軟自發布了 .NET 4.0以後也對其投入頗多,隨後在 .NET 4.5中引入了 async 和 await 關鍵字,使非同步程式設計變得前所未有地簡單。
但是,ASP.NET 中的非同步功能自一開始就可以使用,只是從來沒有得到應有的重視。而且,考慮到 ASP.NET 和 IIS 處理請求的方式,非同步體現的優勢可能更明顯。透過非同步,我們很容易就可以大幅提高 ASP.NET 應用程式的擴充性。隨著新的程式結構引入,如 async 和 await 關鍵字,我們也應該學會使用非同步程式設計的強大功能。
在本篇部落格文章中,我們將討論 IIS 和 ASP.NET 處理請求的方式,然後看看 ASP.NET 中哪些地方可以使用非同步,最後再討論幾個最能體現非同步優勢的場景。
請求是如何處理的?
每個 ASP.NET 請求都要先通過 IIS,然後再由 ASP.NET 處理程序進行最終處理。 首先IIS 接收請求,初步處理後,發送給ASP.NET(必須是一個ASP.NET請求),然後由ASP.NET進行實際處理並產生回應,之後該回應會透過IIS發回給客戶。在IIS上,有一些工作進程負責從佇列中取出請求,並執行IIS 模組,然後再將該請求傳送到ASP.NET 佇列。但是,ASP.NET本身不會建立任何線程,也沒有處理請求的線程池,而是透過使用CLR 線程池,從中取得線程來處理請求。因此,IIS 模組呼叫ThreadPool.QueueUserWorkItem,將請求排入隊列,供CLR 工作執行緒處理。我們都知道,CLR執行緒池是由CLR管理,並且能夠自動調整(也就是說,它根據需要建立和銷毀進程)。這裡也要記住,建立和銷毀執行緒是項目很繁重的任務,這就是為什麼CLR執行緒池允許使用同一個執行緒處理多個任務。下面來看一個描述請求處理過程的圖示。
在上圖中可以看到,請求首先由 HTTP.sys接收,並加入到對應核心級應用程式集區佇列。然後,一個IIS工作執行緒從佇列中取出請求,處理後將其傳送到ASP.NET 佇列。注意,該請求如果不是一個ASP.NET請求,將從 IIS 自動返回。最後,從CLR線程池中分配一個線程,負責處理該請求。
ASP.NET中非同步的使用場景是?
所有請求大致可以分為兩類:
CPU Bound 類
I/O Bound 類
CPU Bound 類請求,需要CPU 時間,而且是在同一進程中執行;而I/O Bound 類請求,本身俱有阻塞性,需要依賴其他模組執行I/O 操作並回傳回應。阻塞性請求是提高應用程式可擴展性的主要障礙,而且在大多數web應用程式中,在等待 I/O 操作的過程中浪費了大量時間。 因此以下場景適合使用非同步:
I/O Bound 類別請求,包括:
資料庫存取
讀/寫檔案
Web 服務呼叫
訪問網路資源
Web 服務呼叫從多個資料來源取得資料的場景作為範例,這裡建立一個簡單的同步頁面,然後再將它轉換成非同步頁面。 本範例設定了1000ms的延遲(以模擬一些繁重的資料庫或web服務呼叫等),而且還使用WebClient下載了一個頁面,如下所示:protected void Page_Load(object sender, EventArgs e) { System.Threading.Thread.Sleep(1000); WebClient client = new WebClient(); string downloadedContent = client.DownloadString("https://msdn.microsoft.com/en-us/library/hh873175%28v=vs.110%29.aspx"); dvcontainer.InnerHtml = downloadedContent; }現在將該頁面轉換成非同步頁面,這裡主要涉及三步驟一:在頁面指令中加入Async = true,將該頁面轉換成非同步頁面,如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Home.aspx.cs" Inherits="AsyncTest.Home" Async="true" AsyncTimeout="3000" %>這裡也加入了AsyncTimeout (可選項),請依需求選擇。 🎜
2.将此方法转换成异步方法。在这里把Thread.Sleep 与 client.DownloadString 转换成异步方法如下所示:
private async Task AsyncWork() { await Task.Delay(1000); WebClient client = new WebClient(); string downloadedContent = await client.DownloadStringTaskAsync("https://msdn.microsoft.com/en-us/library/hh873175%28v=vs.110%29.aspx "); dvcontainer.InnerHtml = downloadedContent; }
3.现在可以直接在 Page_Load (页面加载)上调用此方法,使其异步,如下所示:
protected async void Page_Load(object sender, EventArgs e) { await AsyncWork(); }
但是这里的 Page_Load 返回的类型是async void,这种情况无论如何都应该避免。我们知道,Page_Load 是整个页面生命周期的一部分,如果我们把它设置成异步,可能会出现一些异常情况和事件,比如生命周期已经执行完毕而页面加载仍在运行。 因此,强烈建议大家使用 RegisterAsyncTask 方法注册异步任务,这些异步任务会在生命周期的恰当时间执行,可以避免出现任何问题。
protected void Page_Load(object sender, EventArgs e) { RegisterAsyncTask(new PageAsyncTask(AsyncWork)); }
现在,页面已经转换成了异步页,它就不再是一个阻塞性请求。
笔者在 IIS8.5 上部署了同步页面和异步页面,并使用突发负载对两者进行了测试。测试结果发现,相同的机器配置,同步页面在2-3秒内只能提取1000个请求,而异步页面能够为2200多个请求提供服务。此后,开始收到超时(Timeout)或服务器不可用(Server Not Available)的错误。虽然两者的平均请求处理时间没有多大差别,但是通过异步页面,可以处理两倍以上的请求。这足以证明异步编程功能强大,所以应该充分利用它的优势。
ASP.NET中还有几个地方也可以引入异步:
编写异步模块
使用IHttpAsyncHandler 或 HttpTaskAsyncHandler 编写异步HTTP处理程序
使用web sockets 或 SignalR
结论
本篇博文中,我们讨论了异步编程,而且发现,新推出的async 和 await关键字,使异步编程变得十分简单。我们讨论的话题包括 IIS和ASP.NET如何处理请求,以及在哪些场景中异步的作用最明显。另外,我们还创建了一个简单示例,讨论了异步页面的优势。最后我们还补充了几个ASP.NET中可以使用异步的地方。

C#是一種現代、面向對象的編程語言,由微軟開發並作為.NET框架的一部分。 1.C#支持面向對象編程(OOP),包括封裝、繼承和多態。 2.C#中的異步編程通過async和await關鍵字實現,提高應用的響應性。 3.使用LINQ可以簡潔地處理數據集合。 4.常見錯誤包括空引用異常和索引超出範圍異常,調試技巧包括使用調試器和異常處理。 5.性能優化包括使用StringBuilder和避免不必要的裝箱和拆箱。

C#.NET應用的測試策略包括單元測試、集成測試和端到端測試。 1.單元測試確保代碼的最小單元獨立工作,使用MSTest、NUnit或xUnit框架。 2.集成測試驗證多個單元組合的功能,常用模擬數據和外部服務。 3.端到端測試模擬用戶完整操作流程,通常使用Selenium進行自動化測試。

C#高級開發者面試需要掌握異步編程、LINQ、.NET框架內部工作原理等核心知識。 1.異步編程通過async和await簡化操作,提升應用響應性。 2.LINQ以SQL風格操作數據,需注意性能。 3..NET框架的CLR管理內存,垃圾回收需謹慎使用。

C#.NET面試問題和答案包括基礎知識、核心概念和高級用法。 1)基礎知識:C#是微軟開發的面向對象語言,主要用於.NET框架。 2)核心概念:委託和事件允許動態綁定方法,LINQ提供強大查詢功能。 3)高級用法:異步編程提高響應性,表達式樹用於動態代碼構建。

C#.NET是構建微服務的熱門選擇,因為其生態系統強大且支持豐富。 1)使用ASP.NETCore創建RESTfulAPI,處理訂單創建和查詢。 2)利用gRPC實現微服務間的高效通信,定義和實現訂單服務。 3)通過Docker容器化微服務,簡化部署和管理。

C#和.NET的安全最佳實踐包括輸入驗證、輸出編碼、異常處理、以及身份驗證和授權。 1)使用正則表達式或內置方法驗證輸入,防止惡意數據進入系統。 2)輸出編碼防止XSS攻擊,使用HttpUtility.HtmlEncode方法。 3)異常處理避免信息洩露,記錄錯誤但不返回詳細信息給用戶。 4)使用ASP.NETIdentity和Claims-based授權保護應用免受未授權訪問。

C 語言中冒號 (':') 的含義:條件語句:分隔條件表達式和語句塊循環語句:分隔初始化、條件和增量表達式宏定義:分隔宏名和宏值單行註釋:表示從冒號到行尾的內容為註釋數組維數:指定數組的維數


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)