我正在研究一個應用程序,它使用一堆外部DLL來建立到某個服務器的連接。奇怪的是,這些DLL的公開方法允許連接,但不能斷開或關閉。這些庫工作正常,除非你在一個塊中對服務器進行大量後續調用,所以我決定要在X次調用之後斷開連接並重新連接。銷燬C中的非託管對象#
然而,這裏存在這個問題。由於沒有斷開連接方法,我無法斷開連接。所以我的問題是,我該如何完全殺死這個非託管對象,以便我可以重新創建它?
我正在研究一個應用程序,它使用一堆外部DLL來建立到某個服務器的連接。奇怪的是,這些DLL的公開方法允許連接,但不能斷開或關閉。這些庫工作正常,除非你在一個塊中對服務器進行大量後續調用,所以我決定要在X次調用之後斷開連接並重新連接。銷燬C中的非託管對象#
然而,這裏存在這個問題。由於沒有斷開連接方法,我無法斷開連接。所以我的問題是,我該如何完全殺死這個非託管對象,以便我可以重新創建它?
我能找到的最佳解決方案是在每個調用外部DLL的線程中運行,最終在線程結束時終止。這是唯一可行的解決方案,因爲我無法訪問更新的DLL。
如果您在C#中使用非託管資源,您應該讓您的類使用並與非託管資源進行交互,實現IDisposable
並使用using
塊創建和銷燬它們。
如果您無法斷開連接,具體取決於您正在進行的接口連接,有時將包含非託管資源的變量設置爲空將清除其中的一部分。實際上,如果沒有正確的斷開/處理方法,沒有什麼可以做的。
當我讀到這個問題時,他不能編寫任何有意義的Dispose代碼,因爲本機庫有一個破壞的API。所以我認爲這不會有幫助。 – CodesInChaos 2012-08-09 11:58:49
@CodesInChaos確實,我只是在編輯它。 – 2012-08-09 12:02:20
'使用'並不一定意味着處置時,內存將被釋放。當垃圾收集器啓動時,它將被釋放。 – 2012-08-09 12:15:59
您可以手動關閉到服務器的底層連接。我無法再幫助您瞭解如何在不瞭解服務(HTTP TCP ect?)的情況下了解更多信息。你可以放一些痕跡(如wireshark)並查看正在傳輸的內容。
雖然底線是他們的軟件壞了。你能否聯繫供應商?
可悲的是。他們已經從圖書館轉移到了基於網絡的服務,而且企業還沒有能夠轉移到這種狀態(這是一項巨大的轉換工作)。 – Simon 2012-08-09 13:11:23
聽起來像你的本地庫已經壞了,C#沒有辦法做到這一點。 – CodesInChaos 2012-08-09 11:57:43
垃圾已經提供給您的垃圾庫,或者找到不同的垃圾庫(同時拿起電話嚷嚷誰製造垃圾)或者推出自己的垃圾箱。 – Alex 2012-08-09 11:59:51
不幸的是,這是一個相當複雜的系統的龐大框架,所以重寫不是一種選擇 - 是的,圖書館當然不是最好的工作! :) – Simon 2012-08-09 13:09:58