日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

5.4 异步TCP编程(一)

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

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

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

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

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

5.4.1 異步設計模式概述

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

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

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

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

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

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

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

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

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

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

? ? 調用Begin方法后,程序還應該調用End方法來結束異步操作。

? ? (2)AsyncCallback委托。AsyncCallback委托用于在異步操作完成時調用指定的回調方法。在基于IAsyncResult的異步操作方式下,由于程序可以在啟動異步操作后繼續執行其他代碼,因此必須有一種機制,以保證該異步操作完成時能及時通知調用者。AsyncCallback委托就是為實現這種機制而提供的。

? ? 回調方法是在程序中事先定義的,在回調方法中,通過End方法獲取Begin方法的返回值和所有輸入/輸出參數,從而達到在異步操作方式下完成參數傳遞的目的。

? ? 但是,由于基于IAsyncResult的異步設計模式控制同步問題非常麻煩,而且代碼難以理解。在實際設計中,一般不使用AsyncCallback委托處理異步操作的結果,而是利用輪詢方式來判斷異步操作是否完成。

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

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

轉載于:https://my.oschina.net/zhangjinfu/blog/65375

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。