关闭时服务器异常(阻塞操作中断)

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 损坏,防病毒,防火墙,...