c# – WSACancelBlockingCall异常

好吧,我有一个奇怪的异常抛出我的代码,已经困扰我的年龄。

System.Net.Sockets.SocketException: A blocking operation was interrupted by a call to WSACancelBlockingCall
   at System.Net.Sockets.Socket.Accept()
   at System.Net.Sockets.TcpListener.AcceptTcpClient()

MSDN不是非常有用的:http://msdn.microsoft.com/en-us/library/ms741547(VS.85).aspx和我甚至不知道如何开始排除这一个。它只是每天4或5次,而不是在我们的测试环境。只在生产现场,所有生产现场。

我发现了大量的帖子,询问这个异常,但没有真正的确切的答案,什么是导致它,以及如何处理或防止它。

代码在单独的后台线程中运行,方法启动:

public virtual void Startup()
    {
     TcpListener serverSocket= new TcpListener(new IPEndPoint(bindAddress, port));    
        serverSocket.Start();

然后我运行一个循环,所有新连接作为作业在一个单独的线程池。它变得更复杂,因为应用程序架构,但基本上:

   while (( socket = serverSocket.AcceptTcpClient()) !=null) //Funny exception here
    {
         connectionHandler = new ConnectionHandler(socket, mappingStrategy);
         pool.AddJob(connectionHandler);
    }
  }

从那里,池有它自己的线程,分别照顾自己的线程中的每个工作。

我的理解是AcceptTcpClient()是一个阻塞调用,不知何故winsock告诉线程停止阻塞并继续执行..但为什么?我应该做什么?只是捕获异常并忽略它?

嗯,我确实认为一些其他线程正在关闭套接字,但它肯定不是从我的代码。
我想知道的是:这个套接字由连接客户端关闭(在套接字的另一侧)或者它是由我的服务器关闭。因为正是在这一刻,每当这种异常发生时,它关闭我的监听端口,有效地关闭我的服务。如果这是从远程位置完成,那么这是一个主要问题。

或者,这可以是简单的IIS服务器关闭我的应用程序,从而取消所有我的后台线程和阻塞方法?

是否可能从另一个线程关闭serverSocket?这将导致此异常。
http://stackoverflow.com/questions/31871/wsacancelblockingcall-exception

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – WSACancelBlockingCall异常