我有這種服務,當收到請求時,運行powershell命令並返回結果。這裏是調用者類代碼:如何使C#Powershell調用成員線程安全
public class PowerShellScript {
public PowerShellScript() {
}
public Object[] Invoke(String strScriptName, NameValueCollection nvcParams) {
Boolean bResult = true;
int n = 0;
Object[] objResult = null;
PowerShell ps = PowerShell.Create();
String strScript = strScriptName;
for (n = 0; n < nvcParams.Count; n++) {
strScript += String.Format(" -{0} {1}", nvcParams.GetKey(n), nvcParams[n]);
}
//ps.AddScript(@"E:\snapins\Init-profile.ps1");
ps.AddScript(strScript);
Collection<PSObject> colpsOutput = ps.Invoke();
if (colpsOutput.Count > 0)
objResult = new Object[colpsOutput.Count];
n = 0;
foreach (PSObject psOutput in colpsOutput) {
if (psOutput != null) {
try {
objResult[n] = psOutput.BaseObject;
}
catch (Exception ex) {
//exception should be handeled properly in powershell script
}
}
n++;
}
colpsOutput.Clear();
ps.Dispose();
return objResult;
}
}
方法調用返回由powershell腳本返回的所有結果。
一切都很好。只要這個在一個線程中運行。由於我們調用的某些PowerShell腳本可能需要一個小時才能完成,而且我們不希望服務在那段時間內什麼也不做,所以我們決定採用多線程。 不幸的是,Powershell類不是線程安全的,導致嚴重的內存泄漏和CPU燒錄率。但是,如果我在Invoke方法上使用鎖,這意味着我們爲什麼使用多線程的整個想法將會陷入困境。
任何想法如何解決這個問題?
絕妙的主意。將盡快嘗試。 請注意,看着這個例子,它應該沒有那麼大的區別 – 2010-08-25 07:34:42
沒有。仍然是一個巨大的內存泄漏和CPU燒傷率。即使只有一個線程訪問它。事情是,當它運行在非線程的evnironment,它沒有一個小故障 – 2010-08-25 07:55:06
嗯,那麼也許我誤解了你會得到什麼。資源(內存和CPU)將由您的任務以多線程或不線程方式使用。實際上,如果您同時運行多個任務,多線程方法會消耗更多的資源。順便說一句,「內存泄漏」究竟意味着什麼? – 2010-08-25 08:23:10