2015-12-28 42 views
1

我的服务器应用程序运行良好,直到我尝试关闭它。那时我得到两个例外。我把一个try-catch试图对它们进行调试,并转到以下内容:服务器异常关闭(阻止操作中断)

第一个例外:A blocking operation was interrupted by a call to WSACancelBlockingCall:第二个是Not listening. You must call the Start() method before calling this method.

下面是在异常发生的一个片段:

private void ListenForClients() 
    { 
     this.tcpListener.Start();    

     while (true) 
     { 
      try 
      { 
       TcpClient client = this.tcpListener.AcceptTcpClient(); // EXCEPTION OCCURS HERE 
       string clientIPAddress = "" + IPAddress.Parse(((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString()); 
       ClientIPLabel.Text = clientIPAddress; 
       Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); 
       clientThread.Start(client); 
      } 
      catch (Exception e) 

      { 
       MessageBox.Show(e.Message.ToString()); 
      }        
     } 
    } 

我不知道这是否可能是因为我在这里还是不缺少的东西,但这里是我的代码用于关闭服务器应用程序:

private void ShutdownServer_Click(object sender, EventArgs e) 
    { 
     this.tcpListener.Stop(); 
      Application.Exit(); 
    } 

我也无法从发布版本运行这个应用程序;只要我尝试运行它就会冻结,并且我需要重新启动我的机器才能关闭它(我可以关闭表单,但进程保持在任务管理器中运行,“结束任务”不会关闭它) 。我假设这些异常可能是导致该问题的原因,因为我可以很好地运行调试版本。

+0

这个问题似乎是在tcplistener,因为如果我注释掉'this.tcpListener.Stop();'在我的关机方法,我不得到任何异常,但即使我的GUI关闭,这个过程仍然在后台运行,直到我关闭任务管理器 – Patrick

回答

1

异常是正常的。发生这种情况是因为您正在同时关闭当时正在接受的侦听器。

捕捉该异常并将其扔掉是正确的选择。我会这样做,以使捕获更安全:

//Stop: 
isStopping = true; 
this.tcpListener.Stop(); 

//... 

private void ListenForClients() 
{ 
    this.tcpListener.Start();    

    while (true) 
    { 
     try 
     { 
      TcpClient client = this.tcpListener.AcceptTcpClient(); 
      //... 
     } 
     catch (Exception e) 
     { 
      if (!isStopping) throw; //don't swallow too much! 
     }        
    } 
} 

没有更清洁(无例外)的方式来中断套接字操作。 (是的,这是一个糟糕的情况。)

关于冻结问题,这是不正常的,不是一个.NET问题(.NET无法阻止进程被终止,没有这样的Windows API)。 Windows错误,操作系统损坏,防病毒,防火墙,...

+0

嗯......这对于冻结有点奇怪。我保持系统非常干净,并试图关闭AV并让程序通过防火墙。我在客户端和服务器应用程序的发布版本上遇到了同样的问题,至少可以说,考虑到它们在调试版本中运行良好,这非常令人失望。我宁愿不必将其用作发布。 – Patrick

+0

也许冻结只是在你的应用程序中的错误?在冻结期间暂停调试器以查看堆栈上的内容。 – usr

+0

不幸的是不是这种情况...我已经为这个问题启动了一个新问题[这里](http://stackoverflow.com/questions/34502750/release-builds-hang-crash-regardless-of-code) – Patrick

相关问题