Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法在不关闭套接字的情况下释放套接字上阻塞的线程?_C#_Multithreading_Sockets - Fatal编程技术网

C# 有没有办法在不关闭套接字的情况下释放套接字上阻塞的线程?

C# 有没有办法在不关闭套接字的情况下释放套接字上阻塞的线程?,c#,multithreading,sockets,C#,Multithreading,Sockets,我有一个线程不断地阻塞套接字,读取所有内容,然后再次阻塞,等待更多。它是异步通信协议的一部分,负责获取响应并将它们发送给发出请求的各个线程/窗口。它还处理对“仍然活动”、“超时消息”等的响应。我要寻找的是一种通过方法调用关闭此循环的方法,基本上是释放套接字进行一些手动干预,以防我需要它 有一次,我被告知要解除阻止等待套接字的线程的方法是让其他调用关闭套接字,尽管我不想这样做,但我宁愿让它保持打开状态。我过去处理这个问题的更糟糕的方法是关闭套接字上的阻塞,让它每隔一段时间休眠,或者设置套接字超时以

我有一个线程不断地阻塞套接字,读取所有内容,然后再次阻塞,等待更多。它是异步通信协议的一部分,负责获取响应并将它们发送给发出请求的各个线程/窗口。它还处理对“仍然活动”、“超时消息”等的响应。我要寻找的是一种通过方法调用关闭此循环的方法,基本上是释放套接字进行一些手动干预,以防我需要它

有一次,我被告知要解除阻止等待套接字的线程的方法是让其他调用关闭套接字,尽管我不想这样做,但我宁愿让它保持打开状态。我过去处理这个问题的更糟糕的方法是关闭套接字上的阻塞,让它每隔一段时间休眠,或者设置套接字超时以保持循环,但这两种都是轮询的一种形式,我希望避免这种情况


也许有某种方法可以使用事件来完成,当套接字中有一些数据时是否会抛出事件?

不幸的是,异步I/O编程是最难正确完成的事情之一(在任何语言中)。在Windows中,典型的方法是使用一种称为

幸运的是,在.NET中,Socket类在某种程度上简化了这一点,它支持异步事件作为通知您已在套接字上完成挂起操作的一种方式。美国有一个很好的例子


有关更多信息,请查看CodeProject.com。

不幸的是,异步I/O编程是最难正确完成的事情之一(在任何语言中)。在Windows中,典型的方法是使用一种称为

幸运的是,在.NET中,Socket类在某种程度上简化了这一点,它支持异步事件作为通知您已在套接字上完成挂起操作的一种方式。美国有一个很好的例子


有关更多信息,请查看CodeProject.com。

您可以使用Thread.Interrupt-阻塞调用将返回ThreadInterruptedException,需要处理该异常


您可以找到一个可以使用Thread.Interrupt的示例

阻塞调用将返回需要处理的ThreadInterruptedException


您可以找到一个示例

如果您想保持套接字打开,为什么要中断等待它获取数据的线程?如果此线程可以在等待其套接字的同时执行其他操作,则您可以:

1) 使用“hEvent”等待句柄+WaitForMultipleObjects、完成例程或完整IOCP使用重叠I/O

2) 将所有not blocking on socket活动移动到另一个线程,该线程在句柄数组上使用WFMO等待,其中一个线程正在与仅执行阻塞读取的线程通信


如果您确实必须在不关闭阻塞调用的情况下解除阻塞等待阻塞调用的一个线程,您可以安排让它发送一些数据。在套接字上向对等客户端/服务器发送回显请求。然后,它将回复,取消阻止等待它的rx线程。

如果您想保持套接字打开,为什么要中断等待它的线程以获取数据?如果此线程可以在等待其套接字的同时执行其他操作,则您可以:

1) 使用“hEvent”等待句柄+WaitForMultipleObjects、完成例程或完整IOCP使用重叠I/O

2) 将所有not blocking on socket活动移动到另一个线程,该线程在句柄数组上使用WFMO等待,其中一个线程正在与仅执行阻塞读取的线程通信


如果您确实必须在不关闭阻塞调用的情况下解除阻塞等待阻塞调用的一个线程,您可以安排让它发送一些数据。在套接字上向对等客户端/服务器发送回显请求。然后它会回复,解除等待它的rx线程的阻塞。

哦,天哪,那东西太大了。谢谢你!是的,不幸的是IO完成不适合心脏虚弱的人,但它是可靠执行异步通信的有限方法之一。我试图用它做一些不可靠的事情也无济于事。理论上,这个循环应该总是能够访问套接字的循环,但不是我将它作为一个内部特性添加到我的库中(代码重用等等),但是一旦我打开了这个特性,我就无法关闭它。所以我想要一种基本上收回插座的方法。看起来我可以用建议的线程做我想做的事情。中断思想我的意思是,现在我要把它添加到一个库中。不,亲爱的,那东西太大了。谢谢你!是的,不幸的是IO完成不适合心脏虚弱的人,但它是可靠执行异步通信的有限方法之一。我试图用它做一些不可靠的事情也无济于事。理论上,这个循环应该总是能够访问套接字的循环,但不是我将它作为一个内部特性添加到我的库中(代码重用等等),但是一旦我打开了这个特性,我就无法关闭它。所以我想要一种基本上收回插座的方法。看起来我可以用建议的线程做我想做的事情。中断思想我的意思是,现在我要把它添加到一个库中。不可能,只要我确保正确处理它,这样我就不会在阻止其他东西时杀死它。并从套接字读数周围捕获ThreadInterrupedException。没有比Thread.Abort更危险的地方了。谢谢这可能会很好,只要我确保正确处理它,这样我就不会在阻止其他东西时杀死它。并从套接字读数周围捕获ThreadInterrupedException。没有比Thread.Abort更危险的地方了。谢谢