gpt4 book ai didi

c# - 如何停止非响应线程

转载 作者:太空狗 更新时间:2023-10-29 23:09:28 24 4
gpt4 key购买 nike

我有一个文件传输应用程序,可以在 FTP 服务器之间移动文件。任何时候我们都可以移动数十个文件。为了防止 FTP 服务器泛滥,我有一个监视器和信号量锁系统。

根据调用堆栈,我的 FTP 客户端经常在 System.Net.Sockets.Socket.Receive() 中的某处卡住。我没有异常(exception),所以无法处理这个问题。我想取消该线程,因为它正在阻止其他想要使用 FTP 客户端的线程。

我考虑过在新线程中启动最终调用 System.Net.Sockets.Socket.Receive() 的方法,并在一段时间后中止该线程,但我担心套接字会在线程后保持打开状态中止。在非响应线程之后是否有更优雅的方式来终止和清理?

最佳答案

没有。没有线程的合作,就没有安全、可靠的方法来终止线程。现有的机制可能非常严厉,和/或不一定有效。

  • 您可以尝试Interrupt() 另一个线程,但这通常只会中断正在等待/休眠或正在执行可能阻塞的事情的线程。如果它正在处理不涉及阻塞的事情,它甚至不会看到,更不用说响应中断,直到它再次尝试阻塞。如果您有流氓线程,那很可能是“从不”。
  • Abort()可能 杀死一个线程,但也不能保证——线程可以固执地拒绝终止。即使它确实死了,它也会使您的应用程序域处于可疑状态。 (假设线程在进入 finally block 时中止。将立即抛出一个异常,并且 finally block 将不会运行 - 所以它会释放任何东西(锁,本地资源,无论如何)将保持未发布状态。)
  • 显然,即使卸载应用程序域也只会中止其中的线程,因此 Thread.Abort 的不确定性适用——此外,如果它有效,它还会杀死应用程序域中的每个线程.
  • 唯一相对安全并保证正常工作的是终止整个进程。如果你这样做,就无法保证外部事物的状态。您可以保证持有的任何资源都将被释放/关闭/无论如何,而不是它们处于任何特定状态(例如,“未损坏”)。

在这种情况下,更好的解决方案可能是异步接收(使用真正的异步内容 (ReceiveAsync),而不是 BeginReceive/EndReceive ).这样线程就不会被 native 阻塞,并且更容易中断(如果出于某种原因您仍然必须这样做;异步的好处包括您甚至不需要单独的线程来观察输入)。

关于c# - 如何停止非响应线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11798080/

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