在窗体上有两个按钮,点击button1开启侦听,点击button2关闭侦听private void button1_Click(object sender, System.EventArgs e)
{
try 

thread = new Thread(new ThreadStart(beginlisten)); thread.Start(); button1.Enabled = false;
button2.Enabled = true;

catch(Exception er) 

MessageBox.Show(er.ToString()); 

}private void button2_Click(object sender, System.EventArgs e)
{
this.button1.Enabled = true;
this.button2.Enabled = false;try
{
tcpListener.Stop();thread.Abort();
}
catch(Exception ex)
{
Console.WriteLine(ex.InnerException.ToString());
}
} 线程中运行的代码部分如下:
while(true)
{

Console.Write("Waiting for a connection... ");
TcpClient client = tcpListener.AcceptTcpClient();  
...
...
...
}>>>>>>>>请问为什么我关闭TcpListener的时候会引发下面的异常:System.Net.Socket.SocketException:一个封锁操作对WSACancelBlockingCall的调用中断
at System.Net.Sockets.Socket.Accept
at System.Net.Sockets.TcpListener.AcceptTcpClient那么点击button2时应该怎么样关闭TcpListener才是正确的呢???

解决方案 »

  1.   

    是你线程里面没有处理异常在 TcpListener 被关闭的时候,
    AcceptTcpClient 就会引发异常
    这时候应该抓住它然后结束线程如果没有抓住,异常就会抛到CLR,因为在正在执行的线程里面没有catch
      

  2.   

    楼上的老大,你是说关闭TcpListener一般都会引发AcceptTcpClient的异常吗?
      

  3.   

    方法1:
    以 volatile 方式是定全局 bool 变数 run ,run 等于true 时 while, run 等于false while 退出。方法2:
    while 里面放 try catch , 不能从TcpListener继续监听时退出。
      

  4.   

    想问一下各位,有没有现成的TcpListener和TcpClient连续通讯知道一方退出的例子呢?现在找到的几乎全部都是用Socket类写的
      

  5.   

    要知道另一方是否已中断,如果我没记错,应该是 SocketException,错误代码 10035,这就是“对方中断了连接”时候抛出的异常用网络通讯,大量的try-catch是必须使用的,不能省另外,“方法1:
    以 volatile 方式是定全局 bool 变数 run ,run 等于true 时 while, run 等于false while 退出。”这个没用,因为:while (run) {
      .... tcpListener.AcceptTcpClient(); // 这一句会一直阻塞(停在这里不动),直到接到一个TcpClient,或者出错,所以在 tcpListener 被 Close() 的时候,run 来不及再次判断就出错了线程内的代码应该这样写:try {
      while(true) {
         TcpClient client = tcpListener.AcceptTcpClient();  
         ...
      }
    } catch (SocketException) { } // 在tcpListener被关之后就会到达这里,从而退出死循环
      

  6.   

    不要用thread.abort来关闭线程。你应该用开关量来进行关闭线程,例如:
    private bool blnStop = false;//in your thread function
    while( !blnStop )//replace the previouse "while( true )"
    {
    //other operation here 
    }//Close thread
    blnStop = true;
    yourThread.Join();//Wait thread till its end
      

  7.   

    还有一个问题要请教各位老大,如果在客户端启动Socket.BeginReceive(),代码如下://Socket.BeginReceive()的回调方法
    private void OnRecievedData( IAsyncResult ar )
    {
       Socket sock = (Socket)ar.AsyncState;   try
       {
          int nBytesRec = sock.EndReceive( ar );
          if( nBytesRec > 0 )
          {
             String responseData = String.Empty; responseData = System.Text.Encoding.Unicode.GetString(readBuffer, 0, nBytesRec); Console.WriteLine("Received: {0}", responseData);   sock.BeginReceive(readBuffer, 0, readBuffer.Length, SocketFlags.None, recieveData, sock );   } 
    }如果窗体上有另一个按钮,点击它就会把Socket关闭:socket.Shutdown(SocketShutdown.Both);socket.Close();但总是会抛出异常:无法访问名为"System.Net.Sockets.Socket"的已处置对象。那可能是因为点击Button关闭socket的时候,Socket.BeginReceive()的回调方法中也正好在使用socket,所以出现了问题,那么应该怎么处置这个办法呢?因为OnRecievedData是在线程池里执行的,不能使用XXX.Abort()来停止
      

  8.   

    1)你那个方法的catch在哪里?2)所以我习惯:  try { socket.Shutdown(Both); } catch { }
      try { socket.Close(); } catch { }
      socket = null;
      

  9.   

    呵呵catch{} 部分忘写上去了