【发布时间】:2010-09-07 02:35:50
【问题描述】:
好的,我的代码抛出了一个奇怪的异常,这个异常一直困扰着我。
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 服务器关闭了我的应用程序,从而取消了我所有的后台线程和阻塞方法?
【问题讨论】:
标签: c# multithreading sockets socketexception