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);
}

posted @ 2010-11-28 12:36  董雨  阅读(517)  评论(0编辑  收藏  举报