本帖最后由 jiabiao113 于 2010-07-27 12:06:46 编辑

解决方案 »

  1.   

    当然,用别的方法,比如:
    Socket.BeginAccept (AsyncCallback, Object) 
    这个方法只接受连接请求 不等待数据包, 就不存在这个问题。但是如果想用
    Socket.BeginAccept (Int32, AsyncCallback, Object)  
    重载,也该有解决办法吧?
      

  2.   

    BeginAccept 不会阻塞调用它的线程,因为它是运行在一个新的线程上。如果调用线程阻塞了,最有可能就是你在 BeginAccept 调用了什么 EventWaitHandle, Mutex, Monitor 之类的东东自己堵死了自己。
      

  3.   


    有点明白了原本只想用一个专门的线程来处理连接请求的(不是主线程)
      while (true) {
                listener.BeginAccept(10,
                              new AsyncCallback(SocketListener.acceptCallback), 
                              listener );
            }结果一个客户端一直连接不上,就会影响后面的客户端连接。
      

  4.   

    应该是:while (true) {
                allDone.Reset();
                listener.BeginAccept(10,
                              new AsyncCallback(SocketListener.acceptCallback), 
                              listener );
                allDone.WaitOne();
            }
      

  5.   


    两码事,调用 EndAccept 就结束掉这个线程了。
    如果设计没有错误,每次 BeginAccept 都会在线程池中拿一条线程出来来,它们是互不干涉的,更加不应该有阻塞的情况。此外,异步调用的就是线程池的线程,用完了就赶快释放。如果非要霸占这个线程,那样就是去异步的意义了,还不如开一条线程搞同步。
      

  6.   


    真正的异步操作不需要用 EventWaitHandle, 某些教程类型里面的 EventWaitHandle 都是为了方便初学者理解而已。用了 EventWaitHandle, 异步就变同步。codeproject 上有很多可以实用的例子
      

  7.   


    哦 原来是这样。
    正纳闷msdn里面的例子为什么要在原来的地方停下来,然后开个新线程工作,完成之后 主线程接着运行。