Я пишу приложение на C #, в котором Main () запускает несколько потоков, каждый из которых запускает командлет Get-VM. Я использую RunspacePool для этого.
В настоящее время каждый поток должен сначала запустить Get-VMMServer, а затем Get-VM. Get-VMMServer занимает около 5-6 секунд, что значительно снижает производительность. Ниже приведен фрагмент кода:
static void Main()
{
InitialSessionState iss = InitialSessionState.CreateDefault();
PSSnapInException warning;
iss.ImportPSSnapIn("Microsoft.SystemCenter.VirtualMachineManager", out warning);
RunspacePool rsp = RunspaceFactory.CreateRunspacePool(iss);
rsp.Open();
using (rsp)
{
ClassTest n = new ClassTest();
n.intializeConnection(rsp);
Thread t1 = new Thread(new ThreadStart(n.RunScript));
t1.Start();
Thread t2 = new Thread(new ThreadStart(n.RunScript));
t2.Start();
....
}
....
}
class ClassTest
{
RunspacePool rsp;
public void intializeConnection(RunspacePool _rsp)
{
rsp = _rsp;
}
public void RunScript()
{
PowerShell ps = PowerShell.Create();
ps.RunspacePool = rsp;
ps.AddCommand("Get-VMMServer") AddParameter(...); // Doing this in every thread.
ps.AddCommand("Get-VM").AddParameter("Get-VM", "someVM");
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject result in ps.Invoke())
{
...
}
}
}
Get-VMMServer подключается к серверу Virtual Machine Manager (если соединение еще не существует) и получает объект, представляющий этот сервер, из базы данных Virtual Machine Manager.
Я хочу, чтобы это соединение использовалось каждым потоком.
Как мне этого добиться? Есть ли способ создать это соединение уже в Main (), чтобы его могли использовать все пространства выполнения в пуле?