如何重用Get-VMMServer连接?

时间:2011-08-29 12:18:22

标签: c# powershell hyper-v

我正在编写一个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都可以使用它?

1 个答案:

答案 0 :(得分:0)

您可以尝试将与VMM Server的连接设为单例并让每个线程都使用该...