2012-08-09 110 views
2

我正在研究一个应用程序,它使用一堆外部DLL来建立到某个服务器的连接。奇怪的是,这些DLL的公开方法允许连接,但不能断开或关闭。这些库工作正常,除非你在一个块中对服务器进行大量后续调用,所以我决定要在X次调用之后断开连接并重新连接。销毁C中的非托管对象#

然而,这里存在这个问题。由于没有断开连接方法,我无法断开连接。所以我的问题是,我该如何完全杀死这个非托管对象,以便我可以重新创建它?

+4

听起来像你的本地库已经坏了,C#没有办法做到这一点。 – CodesInChaos 2012-08-09 11:57:43

+3

垃圾已经提供给您的垃圾库,或者找到不同的垃圾库(同时拿起电话嚷嚷谁制造垃圾)或者推出自己的垃圾箱。 – Alex 2012-08-09 11:59:51

+0

不幸的是,这是一个相当复杂的系统的庞大框架,所以重写不是一种选择 - 是的,图书馆当然不是最好的工作! :) – Simon 2012-08-09 13:09:58

回答

0

我能找到的最佳解决方案是在每个调用外部DLL的线程中运行,最终在线程结束时终止。这是唯一可行的解​​决方案,因为我无法访问更新的DLL。

1

如果您在C#中使用非托管资源,您应该让您的类使用并与非托管资源进行交互,实现IDisposable并使用using块创建和销毁它们。

如果您无法断开连接,具体取决于您正在进行的接口连接,有时将包含非托管资源的变量设置为空将清除其中的一部分。实际上,如果没有正确的断开/处理方法,没有什么可以做的。

+0

当我读到这个问题时,他不能编写任何有意义的Dispose代码,因为本机库有一个破坏的API。所以我认为这不会有帮助。 – CodesInChaos 2012-08-09 11:58:49

+0

@CodesInChaos确实,我只是在编辑它。 – 2012-08-09 12:02:20

+0

'使用'并不一定意味着处置时,内存将被释放。当垃圾收集器启动时,它将被释放。 – 2012-08-09 12:15:59

0

您可以手动关闭到服务器的底层连接。我无法再帮助您了解如何在不了解服务(HTTP TCP ect?)的情​​况下了解更多信息。你可以放一些痕迹(如wireshark)并查看正在传输的内容。

虽然底线是他们的软件坏了。你能否联系供应商?

+0

可悲的是。他们已经从图书馆转移到了基于网络的服务,而且企业还没有能够转移到这种状态(这是一项巨大的转换工作)。 – Simon 2012-08-09 13:11:23