2011-08-29 25 views
2

我正在編寫一個C#應用程序,它的Main()將啓動多個線程,每個線程啓動Get-VM命令行開關。我爲此使用RunspacePool。如何重用Get-VMMServer連接?

當前每個線程必須首先啓動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()) 
      { 
       ... 
      } 
     } 
    } 

獲取-VMMServer連接到Virtual Machine Manager服務器(如果連接不存在)和檢索表示從虛擬機管理器數據庫此服務器的對象。

我想這個連接被每個線程重用。

我該如何做到這一點?是否有一種方法可以在Main()中創建此連接,以便池中的所有運行空間都可以使用它?

回答

0

你可以試着做給VMM服務器單身的連接,並具有每個線程使用的是...

+0

我可以運行Get-VMMServer只使用運行空間和每個線程從池中獲取自己Runapces。你如何建議使用單例讓每個線程都使用它? – rockoder