我正在编写一个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()中创建此连接,以便池中的所有Runspaces都可以使用它?
答案 0 :(得分:0)
您可以尝试将与VMM Server的连接设为单例并让每个线程都使用该...