1.採用迴圈方式:
//.....
ManualResetEvent allDone = new ManualResetEvent(false);//訊號量
listener.Listen(100);
while (true)
{
allDone.Reset();
listener.BeginAccept(new AsyncCallback(AcceptCallBack),listener);
allDone.WaitOne();
}
void AcceptCallBack(IAsyncResult result)
{
allDone.Set();
//......
}
有時候覺得對ManualResetEvent類很難理解,通過網上資料和自己理解概括如下:
ManualResetEvent主要是處理主線程與子線程的阻塞關係的,
reset():允許其他需要等待的線程進行阻塞,即讓包含WaitOne()方法的線程阻塞。也就是說允許其他等待的子線程阻塞包含WaitOne方法的主線程。
set():此方法發送一個訊號給作業系統,讓處於等待狀態的摸個線程從阻塞狀態轉換為繼續運行,即讓包含WaitOne方法的線程不再阻塞。s
waitone():阻止當前線程,直到收到解除阻止線程的訊號set()
2.採用回調方式:
不需要使用用訊號, 直接在AcceptCallBack 中再BeginAccept,如:
listener.Listen(100);
listener.BeginAccept(new AsyncCallback(AcceptCallBack),listener);
void AcceptCallBack(IAsyncResult result)
{
Socket skServer= (Socket)result; //負責監聽的linster的socket
Socket skClient = listener.EndAccept(result)
listener.BeginAccept(new AsyncCallback(AcceptCallBack),skServer);
}