C 反射呼叫WebService引起記憶體洩漏

2021-07-22 13:34:26 字數 1817 閱讀 7860

最近寫了乙個小工具,用來定時檢測公司各台伺服器上的webservice是否工作正常.如果無法訪問則報警.

開發思路也很簡單, 設定乙個timer, 定時啟動多個執行緒(每個執行緒負責n臺伺服器訪問任務)去動態訪問各伺服器上的webservice的指定方法. 然後對異常資訊進行報警.

動態訪問webservice技術採用大家都熟悉的反射(reflection), 如下:

/// < summary>          

/// 動態呼叫webservice

/// < /summary>          

/// < param name="url">wsdl服務位址< /param>

/// < param name="classname">類名< /param>  

/// < param name="methodname">方法名< /param>  

/// < param name="args">引數< /param> 

/// < returns>< /returns>

public static object invokewebservice(string url, string classname, string methodname, object args)

trythrow new exception(sb.tostring());

}//生成**例項,並呼叫方法

system.reflection.assembly assembly = cr.compiledassembly;

type t = assembly.gettype(@namespace + "." + classname, true, true);

object obj = activator.createinstance(t);

system.reflection.methodinfo mi = t.getmethod(methodname);

return mi.invoke(obj, args);

}catch (exception ex)

}

完成編碼並簡單測試通過後就投入了使用.大約8小時後發現run這個工具的電腦出現

記憶體不足的報警並導致檢測工具crash !

用dotmemory檢測發現, 每一輪呼叫訪問就會產生大量unmanaged memory 未被釋放(即:記憶體洩漏)

圖1: 灰色區塊中包含了unmanaged memory

圖2: 灰色區塊就是 unmanaged memory

問題應該出在反射上!

因為通過反射載入到記憶體中的dll只有在關閉程式時才會被釋放

, 而這個工具會一直開著並且定時使用反射去動態呼叫webservice, 這樣就會不斷占用記憶體直到資源耗盡.

我曾嘗試在呼叫完成後把能釋放的一切資源都釋放掉但沒有任何幫助. 對於這種反射的情況,微軟似乎也沒有提供乙個很好的辦法.

後記:由於目前沒有找到解決方案, 最終放棄使用動態呼叫webservice改為呼叫固定方法(method), 然後在初始化時依次替換訪問伺服器的ip來實現檢測任務. 

改用此方案後, 再未出現記憶體洩漏的問題.

反射動態呼叫webservice以及超時處理

這裡主要說明的通過反射動態呼叫webservice超時問題的處理 加一句 system.web.services.protocols.webclientprotocol obj timeout 1200000 毫秒 1 動態呼叫webservice方法 2 解決invoke呼叫webservice超...

C 動態呼叫WebService

使用示例 trycatch exception ex 類檔案 using system using system.web using system.xml using system.collections using system.net using system.text using system...

C 動態呼叫WebService

原文 c 動態呼叫webservice c 動態webservice呼叫 string public string wstest string suc string wsd.executequery name,str return suc c using system using system.co...