2010-02-19 43 views
4

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

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

回答

1

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

为了解决这些问题,推荐的方法是将所有IPC服务器通道创建置于子AppDomain中。那么当你想关闭它时,你只需执行close()后面的AppDomain Unload通常的'nice'关闭过程。这将会破坏任何左边的边界。

它将删除任何IPC相关的东西,以及踢头客户端占用IPC通道;)