以
socket
通訊中的非同步方法為例:
public
static
manualresetevent connectdone = new
manualresetevent(false);
public
static
void connectcallback(iasyncresult ar)
", sclient.remoteendpoint.tostring());
connectdone.set();
}
public
static
void
main
(string arg)
(注:manualresetevent
允許執行緒通過發訊號互相通訊。通常,此通訊涉及乙個執行緒在其他執行緒進行之前必須完成的任務。
manualresetevent
就像乙個訊號燈,可以利用它的訊號來通知其它執行緒。它有幾個重要的方法:
reset()
,set()
,waitone()
。初始化該物件時,使用者可以指定其預設的狀態(有訊號
/無訊號),在初始化以後,該物件將保持原來的狀態不變直到它的
reset()
或者set()
方法被呼叫,
reset()
方法將其設定為無訊號狀態,
set()
方法將其設定為有訊號狀態。
waitone()
方法使當前執行緒掛起直到
manualresetevent
物件處於有訊號狀態,此時該執行緒將被啟用。)
本例中,主線程呼叫
connectdone.waitone();
後,主線程阻塞,直到連線操作(即connectcallback)完成,因為連線操作完成之後,執行了connectdone.set()將訊號燈設定為有訊號,
由於呼叫了
manualresetevent.waitone()
方法而處在等待狀態的主線程將接收到這個訊號,於是它接著往下執行,完成後邊的工作。
同步與非同步:
簡單地說,同步即程式執行乙個方法,等該方法返回之後,繼續往下走,
非同步:即程式呼叫乙個方法後立即返回,「巨集觀」而言,主線程與方法執行緒並行執行。
就本例而言,
socket
的非同步方法
beginconnect
被呼叫後,接著執行主線程中該語句之後的**,即:
for (int i = 0; i <5; i++)
console.writeline("do some other work.");
byte
bytedata = encoding.ascii.getbytes("some data.");
如果呼叫的是同步方法,那麼,輸出「
socket connected to
…」一定會在「
do some other work.
」之前,因為主線程必須等待同步方法的返回,但是在非同步的情況下,將可能在5行「
do some other work.
」之間的某個時刻出現「
socket connected to
…」的輸出(實際情況還依賴於作業系統的執行緒排程)。
至於在sclient.beginsend(
…)方法之前呼叫connectdone.waitone(),則是由於前者依賴於連線操作(即connectcallback)的完成,須得同步一下。
非同步Socket程式設計I
下面,用乙個例子來解釋同步通訊和非同步通訊的根本區別。假定乙個伺服器應用程式在指定埠監聽客戶端傳送來的資料。在同步通訊接收中,當伺服器等待從客戶端接收資料時,如果流沒有資料,那麼,主線程會阻塞,直到資料請求得到。因此,在這段時間,伺服器端不能進行任何工作,直到接收到該客戶端的資料。如果此時,另乙個客...
非同步Socket程式設計II
下面的應用程式中有兩個類,乙個實現socket伺服器端,另乙個實現socket客戶端。socket伺服器端應用程式 socket伺服器應用程式在socketserver類中實現 檔名為socketserver.cs 這個類包含乙個主要的socket物件 m mainsocket 和一組工作socke...
2 1 4非同步Socket程式設計例項
首先我們了解下關於非同步程式設計的一些知識可以參考我在網上收集的一些資料 c 非同步socket程式設計 我實現了基於非同步通訊的socket伺服器和客戶端程式 下面是我的 第一步 首先新建乙個服務端專案ybserverwindowsforms 然後在專案裡新增乙個自定義的類名為stateobjec...