Хорошо, у меня есть странное исключение из моего кода, который беспокоит меня целую вечность.
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, закрывающий мое приложение и, таким образом, отменяющий все мои фоновые потоки и методы блокировки?