关闭时服务器异常(阻塞操作中断)
Server exception on close (blocking operation interrupted)
我的服务器应用程序 运行 在我尝试关闭它之前一切正常。那时我有两个例外。我放入一个 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();
}
我也无法从发布版本 运行 此应用程序;我一尝试 运行 它就冻结了,我需要重新启动我的机器才能关闭它(我可以关闭表单,但进程在任务管理器中保持 运行ning 并且 "end task" 不会关闭它)。我假设这些异常可能是导致该问题的原因,因为我可以 运行 调试构建就好了。
异常正常。发生这种情况是因为您同时关闭了当时正在接受的侦听器。
捕获该异常并将其丢弃是正确的选择。我会这样做以使捕获更安全:
//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不能防止进程被杀,没有WindowsAPI)。 Windows 错误,OS 损坏,防病毒,防火墙,...
我的服务器应用程序 运行 在我尝试关闭它之前一切正常。那时我有两个例外。我放入一个 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();
}
我也无法从发布版本 运行 此应用程序;我一尝试 运行 它就冻结了,我需要重新启动我的机器才能关闭它(我可以关闭表单,但进程在任务管理器中保持 运行ning 并且 "end task" 不会关闭它)。我假设这些异常可能是导致该问题的原因,因为我可以 运行 调试构建就好了。
异常正常。发生这种情况是因为您同时关闭了当时正在接受的侦听器。
捕获该异常并将其丢弃是正确的选择。我会这样做以使捕获更安全:
//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不能防止进程被杀,没有WindowsAPI)。 Windows 错误,OS 损坏,防病毒,防火墙,...