好的,我的代码抛出了一个奇怪的异常,这一直困扰着我多年。
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);
}
}
从那里开始,pool
它拥有自己的线程,分别处理自己线程中的每个作业。
我的理解是 AcceptTcpClient() 是一个阻塞调用,并且 winsock 以某种方式告诉线程停止阻塞并继续执行..但是为什么呢?我该怎么办?只是捕获异常并忽略它?
好吧,我确实认为其他一些线程正在关闭套接字,但它肯定不是来自我的代码。我想知道的是:此套接字是由连接客户端(在套接字的另一侧)关闭还是由我的服务器关闭。因为此时此刻,每当发生此异常时,它都会关闭我的侦听端口,从而有效地关闭我的服务。如果这是从远程位置完成的,那么这是一个主要问题。
或者,这是否只是 IIS 服务器关闭了我的应用程序,从而取消了我所有的后台线程和阻塞方法?