我正在查詢遠程服務器上的特定服務,試圖確定這些服務的狀態,並相應地啓動/停止/暫停它們。C#有效地迭代和比較/識別WMI服務
我的服務器對象類的一個片段如下:
public class Server
{
public ManagementClass Services { get; set; }
public List<string> TargetServices { get; set; }
}
我利用ManagementClass對象的連接到我的服務器作爲一種生活必需品(範圍,ConnectionOptions的套裝,且ManagementPath( 「win32_service時」)TargetedServices簡直是我所定義的服務,我打算在我的連接返回結果我TargetedService的例子可以被看作是所有服務中的目標的一個小名單如下:
server.TargetedServices = new List<string>() { "ServiceA", "ServiceB" };
現在,我的鬥爭來了當我希望從所有可用的服務中找到我在我的小列表中定義的服務時,就會發揮作用,以便隔離它們並操縱它們。我完成了這項任務,但處理速度非常緩慢。我希望找到一個聰明的,簡化的解決方案。有什麼想法嗎?
這是我目前(畏縮)邏輯:
public void PingServices(List<Server> servers)
{
foreach(Server server in servers)
{
foreach(ManagementObject service in server.Services.GetInstances())
{
foreach(string target in server.TargetServices)
{
if(service.GetPropertyValue("Name").ToString() == target)
{
service.InvokeMethod("StartService", null);
}
}
}
}
}
您可以在每臺服務器上找到服務名稱時對服務名稱進行折扣。那麼當你找到他們時,你可以立即停下來並轉移到下一臺服務器上?你可以在多個線程上運行。你需要分析一下,找出什麼是緩慢的。 – user2509738
我同意多個線程可能會幫助多個服務器的過程。但是,對於一次服務器來說,這個過程是無法接受的緩慢。我查看了LINQ語句,它可以將兩個列表合併在一起。然而,我不能合併和以保留.InvokeMethod() –
scniro