好吧,我有一個奇怪的異常從我的代碼引發了很多年來一直困擾着我。WSACancelBlocking呼叫異常
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服務器關閉我的應用程序,從而取消我的所有後臺線程和阻止方法?
說吧。你如何從另一個線程關閉它?套接字是否需要「易失性」? – 2011-03-26 21:21:31