【问题标题】:.NET IpcChannel doesn't reliably clean up properly?.NET IpcChannel 不能可靠地正确清理?
【发布时间】:2010-02-19 14:49:46
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    是的,我以前见过。

    当客户端仍然打开 IPC 通道时,IPC 可能会发生类似的情况:服务器将无法关闭并再次打开它,因为它已被客户端使用。

    要解决这些问题,推荐的方法是将所有 IPC 服务器频道创建放在子AppDomain
    然后,当您希望将其关闭时,您只需执行Close() 的通常“不错”关闭程序,然后执行AppDomain 卸载。
    这将消除任何残留物。

    它会删除任何与 IPC 相关的东西,并且会因为占用 IPC 通道而将客户端踢到头上;)

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2019-01-28
      相关资源
      最近更新 更多