【发布时间】:2012-10-08 13:53:26
【问题描述】:
由于我(和 Internet 上的许多其他人)在使用 .NET Remoting 时无法配置客户端 TcpChannel 超时(请不要建议适当的修复,我已经尝试了所有方法,请没有 WCF 建议),我想出了一个看起来不错的解决方法来创建我们可以配置的客户端超时。如果我通过单独的计时器线程提供每个远程处理调用,并且调用超时或抛出异常,那么我可以终止线程并假设服务器已关闭。
但是,我是由另一位同事运行的,他坚持认为我这样做可能会导致 .NET 的本机机器代码出现死锁。我已经在互联网上阅读过此类技术的其他实例,例如this post here,所以我不确定是否真的应该担心死锁。我可以看到,如果线程在发送或接收某些东西的过程中中止,这可能是个问题,但如果我们只是在等待响应,则不是。
【问题讨论】:
-
当您说“杀死线程”时,您是在谈论使用 Thread.Abort 吗?如果是这样,确实在某些情况下会导致令人讨厌的副作用。请参阅this answer 了解更多信息。
-
我在考虑使用 Thread.Abort(),但仔细检查 System.Threading.Thread 会显示 Join 方法,该方法会阻塞调用线程,直到子线程返回或达到超时。这似乎是一种更安全的方法。
-
注意Join不会在超时的情况下终止线程;加入超时后,死锁或其他行为异常的线程仍将在后台运行。
-
如果我错了,请纠正我,但是如果线程完成了它的功能,线程不会终止吗?最终超时确实发生了,我只是无法配置它(大约需要 45-60 秒)。这会导致一个异常,我已经处理过了,什么也不做,最终线程函数确实返回了。
-
是的,如果线程实际完成,它将终止。只有当你因为它被锁定而试图终止时,Join 才会让它挂起。调用 Join 的线程将在超时后返回,但您尝试加入的线程将处于“锁定”状态。
标签: c# .net timeout .net-remoting