【问题标题】:Server exception on close (blocking operation interrupted)关闭服务器异常(阻塞操作中断)
【发布时间】:2015-12-28 22:53:43
【问题描述】:

我的服务器应用程序运行良好,直到我尝试关闭它。那时我有两个例外。我放入了一个 try-catch 来尝试调试它们,然后执行以下操作:

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

这是发生异常的 sn-p:

    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();
    }

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

【问题讨论】:

  • 问题似乎出在tcplistener中,因为如果我在关闭方法中注释掉this.tcpListener.Stop();,我没有得到任何异常,但即使我的GUI关闭,进程仍在运行在后台,直到我用任务管理器关闭它

标签: c# exception tcp listener blocking


【解决方案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 错误、操作系统损坏、防病毒、防火墙、...

【讨论】:

  • 嗯……那结冰真奇怪。我的系统非常干净,我尝试关闭 AV 并让我的程序通过防火墙。我在客户端和服务器应用程序的发布版本中遇到了同样的问题,至少可以说非常令人失望,因为它们在调试版本中运行良好。我宁愿不必将其用作发行版。
  • 也许冻结只是您的应用程序中的一个错误?在冻结期间暂停调试器以查看堆栈中的内容。
  • 不幸的是不是这样...我已经针对该问题提出了一个新问题HERE
猜你喜欢
  • 2013-03-22
  • 2013-10-06
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多