Main()が複数のスレッドを開始し、各スレッドがGet-VMコマンドレットを起動するC#アプリケーションを作成しています。これには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サーバーに接続し(接続がまだ存在しない場合)、VirtualMachineManagerデータベースからこのサーバーを表すオブジェクトを取得します。
この接続を各スレッドで再利用したいと思います。
どうすればこれを達成できますか?プール内のすべてのRunspaceが使用できるように、この接続をMain()にすでに作成する方法はありますか?