我的服务器应用程序运行完全正常,直到我尝试关闭它。那时我有两个例外。我在try-catch中尝试调试它们,然后执行以下操作:
第一个例外是: 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();
}
以下是发生异常的片段:
{{1}}
我不确定是否可能是因为我在这里遗漏了一些东西,但这是关闭服务器应用程序的代码:
{{1}}
我也无法从发布版本中运行此应用程序;它只是在我尝试运行时冻结,我需要重新启动我的机器才能关闭它(我可以关闭表单,但是进程在任务管理器中保持运行并且“结束任务”不会关闭它) 。我假设这些异常可能是导致该问题的原因,因为我可以运行调试版本。
答案 0 :(得分:1)
异常是正常的。之所以会发生这种情况,是因为您正在同时关闭当时正在接受的侦听器。
捕获该异常并将其丢弃是正确的选择。我会这样做,以使捕获更安全:
{{1}}
没有更清洁(无异常)的方式来中断套接字操作。 (是的,这是一个糟糕的情况。)
关于冻结问题,这不正常,也不是.NET问题(.NET无法阻止进程被杀死,没有这样的Windows API)。 Windows错误,操作系统损坏,防病毒,防火墙,......