gpt4 book ai didi

c# - .NET IpcChannel 不能可靠地正确清理?

转载 作者:行者123 更新时间:2023-11-30 12:53:30 28 4
gpt4 key购买 nike

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

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

最佳答案

是的,我以前见过这个。

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

要解决这些问题,推荐的方法是将所有 IPC 服务器 channel 创建放在子AppDomain 中。
然后,当您希望将其关闭时,您只需执行 Close() 后跟 AppDomain Unload 的通常“良好”关闭过程即可。
这将消除任何遗留物。

它将删除所有与 IPC 相关的内容,并踢出客户占用 IPC channel 的脑袋;)

关于c# - .NET IpcChannel 不能可靠地正确清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2297114/

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