c#中异步socket编程
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);
}