我使用的是异步多线程的socket。经常遇到以下几个问题不知道怎么解决:1、在开始了beginReceiveFrom之后,如果没有收到响应,想停止这个EndReceiveFrom等待,却不知道该怎么停止。2、因为没有办法停止EndReceiveFrom的等待,因此每次在应用程序关闭的时候,总会因为关闭socket而导致System.ObjectDisposedException: 无法访问名为“System.Net.Sockets.Socket”的已处置对象。
对象名: “System.Net.Sockets.Socket”这样一个异常。3、在BeginReceiveFrom的callBack函数里面使用EndReceiveFrom时,时不时会出现:System.Net.Sockets.SocketException: 由于线程退出或应用程序请求,已放弃 I/O 操作。
   at System.Net.Sockets.Socket.EndReceiveFrom(IAsyncResult asyncResult, EndPoint& endPoint)这样一个异常。请问高手这些问题是怎样引起和有什么办法解决吗?

解决方案 »

  1.   

    办法一:mytThread.join(500); //该线程500ms内没完成,则结束线程
    办法二:private static ManualResetEvent myMaEvent=new ManualResetEvent(false);
    myMaEvent.Reset(); //该事件设为非终止
    beginReceiveFrom()···
    int timeout=500;
    if(myMaEvent.WaitOne(timeout,false))
    if(beginReceiveFrom判断是否接收成功)
    return 成功;
    else
    return timeout;最后要把这句:myMaEvent.Set();放在异步处理函数中
      

  2.   

    多谢ch999(欢乐时光) 的回复。对于问题1,如何结束异步处理函数里面的EndReceiveFrom在没有收到信息时的阻断状态,这个确实是无计可施。而问题2是由问题1直接产生的,因为如果可以结束EndReceiveFrom的阻断,那么在结束程序的时候,就不会因为EndReceiveFrom还真阻断而触发这个异常了。问题3是我还没有弄清是怎么回事的,因为整个接收过程我都是使用如下的一个递归过程:
    receive(){
    BeginReceiveFrom(... , ... ,callBack);
    .....
    }
    callBack(.....){EndReceiveFrom();//do something....receive();
    }然后这是在一个单独的线程里面进行的。是我的做法不对,还是有些要注意的地方我没有注意呢?
      

  3.   

    建议你多看一下sdk中wintalk,这个例子中有你需要的东西
      

  4.   

    例子看完了。这个例子写得很精炼,可惜它是TCP的,而我遇到的问题是因为使用UDP....
    对于异步和阻塞,还有UDP和TCP这几个概念的组合,我真的迷惑了~~~