2

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()にすでに作成する方法はありますか?

4

1 に答える 1