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()中創建此連接,以便池中的所有運行空間都可以使用它?
我可以運行Get-VMMServer只使用運行空間和每個線程從池中獲取自己Runapces。你如何建議使用單例讓每個線程都使用它? – rockoder