У меня есть этот сервис, который при получении запроса запускает команду powershell и возвращает результат.Вот код класса invoker:
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;
}
}
Метод Invoke возвращает все результаты, возвращаемые скриптом powershell.
Все хорошо и хорошо.Пока это работает в одном потоке.Поскольку некоторые сценарии PowerShell, которые мы вызываем, могут занять до часа, и мы не хотим, чтобы сервис ничего не делал в это время, мы решили использовать многопоточность.К сожалению, класс Powershell не является потокобезопасным, что приводит к серьезным утечкам памяти и скорости записи процессора.Однако, если я использую блокировку в методе Invoke, это будет означать, что вся идея, по которой мы пошли в многопоточном режиме, пойдет не так.