.NET IpcChannel无法可靠地正常清理?

时间:2010-02-19 14:49:46

标签: c# .net serialization remoting named-pipes

出于某种原因,在使用IpcChannel并将其关闭后,有时命名管道会保持打开状态,并且线程正在等待它。我不能在调试环境中根据需要实现这一点,但在我们的生产环境中每天发生5到10次。这样做的不好的结果是它阻止我卸载appdomain,因为在命名管道上有一个无限等待的线程(在本机方法中)...我的代码中没有callstack上的框架 - 它是内部的。网络线程。如果我启动进程资源管理器并找到保持打开并强行关闭它的命名管道句柄,那么它会再次变得快乐,appdomain卸载正常。我可能做错了,因为我没有和IpcChannels一起工作过很多....我的服务器端代码在这里:http://pastebin.com/f6e2583b9如果有人想偷看......这就是运行在完全修补的Server2003 / .NET 2.0上。

作为一个丑陋的解决方法,我想我会跟踪我创建的每个频道,然后定期检查以确保它们正确关闭,然后在appdomain卸载我会强行关闭任何悬挂的管道....任何人都可以指出我是如何做到这一点的正确方向?我知道管道的名称....但我不知道如何检查它是否仍然打开,或者如何关闭任何现有的句柄......

1 个答案:

答案 0 :(得分:1)

是的,我以前见过这个。当客户端仍然打开IPC通道时,IPC会发生类似的事情 - 服务器将无法关闭并再次打开它,因为客户端已经在使用它。

要解决这些问题,建议的方法是将所有IPC服务器通道创建放在子AppDomain中。然后,当你想要关闭它时,你只需执行通常的'nice'关闭程序,然后执行关闭(),然后执行AppDomain卸载。这将消除任何遗留问题。

它将删除任何与IPC相关的内容,并将客户端放在脑中以占用IPC频道;)