2012-08-09 156 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