日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5.4 异步TCP编程(一)

發(fā)布時間:2025/6/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5.4 异步TCP编程(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

摘自《C#網(wǎng)絡應用編程》(第2版)
看到網(wǎng)上資料很少,做個摘錄,如有版權(quán)問題,請告知。

? ? 利用TcpListener類和TcpClient類在同步方式下接收、發(fā)送數(shù)據(jù)以及監(jiān)聽客戶端連接時,在操作沒有完成之前一直處于阻塞狀態(tài),這種同步TCP編程模式在開啟的前臺線程不太多的情況下是比較合適的。但是,如果開啟的前臺線程較多,系統(tǒng)的性能就會受到影響。這種情況下,最好的辦法是使用異步操作。

? ? 實際上,在大型的應用系統(tǒng)中,多數(shù)都采用異步工作方式,因此希望讀者盡可能掌握本節(jié)的主要設計思想,為編寫復雜的網(wǎng)絡應用程序打好基礎。

5.4.1 異步設計模式概述

? ? 所謂異步操作方式,就是我們希望讓某個工作開始以后能在這個工作尚未完成的時候繼續(xù)處理其他工作。異步操作一般在單獨的線程中進行,調(diào)用異步方法異步執(zhí)行某個操作時,可同時繼續(xù)執(zhí)行該異步方法后面的代碼。

? ? 使用異步操作方式編寫程序就是異步編程。

? ? 異步編程有兩種模式,一種是基于事件的異步設計模式,另一種是基于IAsyncResult的異步設計模式。基于事件的異步設計模式封裝了異步編程的復雜度,簡化了異步設計的難度,理解起來比較直觀。基于IAsyncResult的異步設計模式提供了更靈活的控制功能,但實現(xiàn)代碼理解起來相對困難一些。

? ? 1、基于事件的異步設計模式

? ??基于事件的異步設計模式用事件驅(qū)動模型實現(xiàn)異步方法,這種模式用單獨的線程在后臺執(zhí)行耗時的任務,當后臺任務完成時,就自動觸發(fā)對應的事件。該模式既具有多線程應用程序的優(yōu)點,同時也隱匿了多線程設計中固有的許多復雜問題。BackgroundWorker組件就是用這種模式提供的對異步操作封裝后的、適用于一般異步設計的組件,利用它可以完成絕大多數(shù)異步設計任務,而不需要考慮復雜的異步操作細節(jié)。除此之外,還有其他的控件和組件也提供了基于事件的異步設計模式,如PictureBox控件等。

? ? 編寫不太復雜的異步操作的應用程序時,建議盡量使用基于事件的異步設計模式。因為它能有效的提高項目開發(fā)效率和質(zhì)量,同時也降低了異步編程的復雜度。

? ? 2、基于IAsyncResult的異步設計模式

? ??TcpListener和TcpClient除了提供同步模式下對應的方法,還為基于IAsyncResult的異步設計模式提供了對應的方法,以便為程序員提供更加靈活的異步編程支持。

? ? (1)基本原理。基于IAsyncResult的異步設計模式通過前綴分別為“Begin”和“End”的兩個方法實現(xiàn)開始和結(jié)束異步操作,每個Begin方法都必須有一個與其對應的End方法,如BeginAcceptTcpClient和EndAcceptTcpClient方法等。程序在調(diào)用Begin方法后,調(diào)用該方法的線程會繼續(xù)執(zhí)行其下面的語句,同時該方法用另一個單獨的線程執(zhí)行異步操作,當異步操作完成后,會返回一個實現(xiàn)IAsyncResult接口的對象,該對象存儲了有關異步操作的信息。這些信息包括以下內(nèi)容。

? ? AsyncState:包含異步操作需要的狀態(tài)信息,如果不需要狀態(tài)信息,可以將此設置為null。
????AsyncWaitHandle:用于在異步操作完成前阻止程序執(zhí)行。
????CompletedSynchronously:指示異步操作是否在用于調(diào)用Begin前綴的線程上完成,而不是在單獨的ThreadPool線程上完成。
????IsCompleted:一個布爾值,指示異步操作是否已完成。

? ? 調(diào)用Begin方法后,程序還應該調(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的異步設計模式控制同步問題非常麻煩,而且代碼難以理解。在實際設計中,一般不使用AsyncCallback委托處理異步操作的結(jié)果,而是利用輪詢方式來判斷異步操作是否完成。

? ? 具體實現(xiàn)思路為:調(diào)用Begin方法得到IAsyncResult對象,再循環(huán)判斷該對象的IsCompleted屬性,來決定異步操作是否完成。在這種情況下,將Begin方法的AsyncCallback參數(shù)設置為null即可。

? ? 在本章后面的異步編程例子中,我們還會學習具體設計方法。

轉(zhuǎn)載于:https://my.oschina.net/zhangjinfu/blog/65375

總結(jié)

以上是生活随笔為你收集整理的5.4 异步TCP编程(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。