//.....
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();
    //......  
}我刚刚接触SOCKET,有点迷糊了。
ManualResetEvent.Reset()  说明描述该方法将事件状态设置为非终止,导致线程阻塞,但我跟踪到这部发现后面的还是执行了的,并没有阻塞(疑惑一),然后执行到WaitOne()方法阻塞了,这样主线程阻塞了,那AcceptCallBack方法种的Set(),也就是设置为终止状态的方法,怎么会执行呢,不就始终阻塞了吗?(疑惑二),但我运行程序发现并不是这样的。当主线程阻塞后,但有CLIENT请求该服务端程序,还是会执行AcceptCallBack的方法的。希望高手们解释下,谢谢了

解决方案 »

  1.   

    疑惑一:reset()并不是让本线程阻塞,而是让那些等待这个事件的线程阻塞。所以,你的程序继续执行,这是正确的。
    疑惑二:set()的意思同上,让那些等待此事件的线程运行。
    waitone(),线程们在此处等待事件。
    你不要光看SDK文档里的对某个函数的表面解释,要弄清楚它背后的真实意思。
      

  2.   

    你的程序大体上运行是这样的:
    主线程                                             事件          异步线程池线程 一个循环
    allDone.Reset();                                    无信号           无             
    BeginAccept                                         无信号         开始运行(等待连接)
    allDone.WaitOne();//阻塞,等待信号                  无信号        等待连接
    阻塞,等待信号                                      无信号        等待连接
         ///////////以上两个线程都将会阻塞直到假设有个客户来连接////////////////
    阻塞,等待信号                                      无信号          AcceptCallBack()//刚刚开始调用
    阻塞,等待信号                                      有信号          allDone.Set();
    运行,开始进入下一个循环                            有信号       做自己的工作,下个连接不一定这个线程负责
    在下一个循环第一句将再次把信号置为无                无信号        /////////
      

  3.   

    你的这段程序,貌似是使用异步IO来实现同步的Accept()函数啊?
      

  4.   

    不需要用信号, 直接在AcceptCallBack 中再BeginAcceptlistener.Listen(100);listener.BeginAccept(new AsyncCallback(AcceptCallBack),listener);
    void AcceptCallBack(IAsyncResult result)
    {
           Socket listener = (Socket)result;
           Socket s = listener.EndAccept(result)
           listener.BeginAccept(new AsyncCallback(AcceptCallBack),listener);
    }