5.4 异步TCP编程(一)
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
摘自《C#網(wǎng)絡(luò)應(yīng)用編程》(第2版)
看到網(wǎng)上資料很少,做個摘錄,如有版權(quán)問題,請告知。
? ? 利用TcpListener類和TcpClient類在同步方式下接收、發(fā)送數(shù)據(jù)以及監(jiān)聽客戶端連接時,在操作沒有完成之前一直處于阻塞狀態(tài),這種同步TCP編程模式在開啟的前臺線程不太多的情況下是比較合適的。但是,如果開啟的前臺線程較多,系統(tǒng)的性能就會受到影響。這種情況下,最好的辦法是使用異步操作。
? ? 實際上,在大型的應(yīng)用系統(tǒng)中,多數(shù)都采用異步工作方式,因此希望讀者盡可能掌握本節(jié)的主要設(shè)計思想,為編寫復(fù)雜的網(wǎng)絡(luò)應(yīng)用程序打好基礎(chǔ)。
5.4.1 異步設(shè)計模式概述
? ? 所謂異步操作方式,就是我們希望讓某個工作開始以后能在這個工作尚未完成的時候繼續(xù)處理其他工作。異步操作一般在單獨的線程中進行,調(diào)用異步方法異步執(zhí)行某個操作時,可同時繼續(xù)執(zhí)行該異步方法后面的代碼。
? ? 使用異步操作方式編寫程序就是異步編程。
? ? 異步編程有兩種模式,一種是基于事件的異步設(shè)計模式,另一種是基于IAsyncResult的異步設(shè)計模式。基于事件的異步設(shè)計模式封裝了異步編程的復(fù)雜度,簡化了異步設(shè)計的難度,理解起來比較直觀。基于IAsyncResult的異步設(shè)計模式提供了更靈活的控制功能,但實現(xiàn)代碼理解起來相對困難一些。
? ? 1、基于事件的異步設(shè)計模式
? ??基于事件的異步設(shè)計模式用事件驅(qū)動模型實現(xiàn)異步方法,這種模式用單獨的線程在后臺執(zhí)行耗時的任務(wù),當(dāng)后臺任務(wù)完成時,就自動觸發(fā)對應(yīng)的事件。該模式既具有多線程應(yīng)用程序的優(yōu)點,同時也隱匿了多線程設(shè)計中固有的許多復(fù)雜問題。BackgroundWorker組件就是用這種模式提供的對異步操作封裝后的、適用于一般異步設(shè)計的組件,利用它可以完成絕大多數(shù)異步設(shè)計任務(wù),而不需要考慮復(fù)雜的異步操作細節(jié)。除此之外,還有其他的控件和組件也提供了基于事件的異步設(shè)計模式,如PictureBox控件等。
? ? 編寫不太復(fù)雜的異步操作的應(yīng)用程序時,建議盡量使用基于事件的異步設(shè)計模式。因為它能有效的提高項目開發(fā)效率和質(zhì)量,同時也降低了異步編程的復(fù)雜度。
? ? 2、基于IAsyncResult的異步設(shè)計模式
? ??TcpListener和TcpClient除了提供同步模式下對應(yīng)的方法,還為基于IAsyncResult的異步設(shè)計模式提供了對應(yīng)的方法,以便為程序員提供更加靈活的異步編程支持。
? ? (1)基本原理。基于IAsyncResult的異步設(shè)計模式通過前綴分別為“Begin”和“End”的兩個方法實現(xiàn)開始和結(jié)束異步操作,每個Begin方法都必須有一個與其對應(yīng)的End方法,如BeginAcceptTcpClient和EndAcceptTcpClient方法等。程序在調(diào)用Begin方法后,調(diào)用該方法的線程會繼續(xù)執(zhí)行其下面的語句,同時該方法用另一個單獨的線程執(zhí)行異步操作,當(dāng)異步操作完成后,會返回一個實現(xiàn)IAsyncResult接口的對象,該對象存儲了有關(guān)異步操作的信息。這些信息包括以下內(nèi)容。
? ? AsyncState:包含異步操作需要的狀態(tài)信息,如果不需要狀態(tài)信息,可以將此設(shè)置為null。
????AsyncWaitHandle:用于在異步操作完成前阻止程序執(zhí)行。
????CompletedSynchronously:指示異步操作是否在用于調(diào)用Begin前綴的線程上完成,而不是在單獨的ThreadPool線程上完成。
????IsCompleted:一個布爾值,指示異步操作是否已完成。
? ? 調(diào)用Begin方法后,程序還應(yīng)該調(diào)用End方法來結(jié)束異步操作。
? ? (2)AsyncCallback委托。AsyncCallback委托用于在異步操作完成時調(diào)用指定的回調(diào)方法。在基于IAsyncResult的異步操作方式下,由于程序可以在啟動異步操作后繼續(xù)執(zhí)行其他代碼,因此必須有一種機制,以保證該異步操作完成時能及時通知調(diào)用者。AsyncCallback委托就是為實現(xiàn)這種機制而提供的。
? ? 回調(diào)方法是在程序中事先定義的,在回調(diào)方法中,通過End方法獲取Begin方法的返回值和所有輸入/輸出參數(shù),從而達到在異步操作方式下完成參數(shù)傳遞的目的。
? ? 但是,由于基于IAsyncResult的異步設(shè)計模式控制同步問題非常麻煩,而且代碼難以理解。在實際設(shè)計中,一般不使用AsyncCallback委托處理異步操作的結(jié)果,而是利用輪詢方式來判斷異步操作是否完成。
? ? 具體實現(xiàn)思路為:調(diào)用Begin方法得到IAsyncResult對象,再循環(huán)判斷該對象的IsCompleted屬性,來決定異步操作是否完成。在這種情況下,將Begin方法的AsyncCallback參數(shù)設(shè)置為null即可。
? ? 在本章后面的異步編程例子中,我們還會學(xué)習(xí)具體設(shè)計方法。
轉(zhuǎn)載于:https://my.oschina.net/zhangjinfu/blog/65375
總結(jié)
以上是生活随笔為你收集整理的5.4 异步TCP编程(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB 访问控制
- 下一篇: RedHat5.6x64下配置Oracl