gpt4 book ai didi

c# - WSACancelBlockingCall 异常

转载 作者:IT王子 更新时间:2023-10-29 03:55:37 27 4
gpt4 key购买 nike

好的,我的代码抛出了一个奇怪的异常,这个异常困扰了我很长时间。

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);
}
}

从那里开始, 拥有自己的线程,分别处理自己线程中的每个作业。

我的理解是 AcceptTcpClient() 是一个阻塞调用,而 winsock 以某种方式告诉线程停止阻塞并继续执行。但是为什么呢?我该怎么办?只是捕获异常并忽略它?


好吧,我确实认为其他线程正在关闭套接字,但它肯定不是来 self 的代码。我想知道的是:这个套接字是由连接的客户端(在套接字的另一端)关闭还是由我的服务器关闭。因为就目前而言,每当发生此异常时,它都会关闭我的监听端口,从而有效地关闭我的服务。如果这是从远程位置完成的,那么这是一个主要问题。

或者,这可能只是 IIS 服务器关闭了我的应用程序,从而取消了我所有的后台线程和阻塞方法吗?

最佳答案

serverSocket 是否可能被另一个线程关闭?这将导致此异常。

关于c# - WSACancelBlockingCall 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31871/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com