好的,我的代码抛出了一个奇怪的异常,一直困扰着我。
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服务器关闭了我的应用程序,从而取消了我的所有后台线程和阻塞方法?