1

我正在查询远程服务器上的特定服务,试图确定这些服务的状态,并相应地启动/停止/暂停它们。

我的服务器对象类的片段如下:

public class Server
{
    public ManagementClass Services { get; set; }

    public List<string> TargetServices { get; set; }
}

我使用 ManagementClass 对象连接到我的服务器作为其他必需品(Scope、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);
                    }
                }
            }
        }
    }
4

2 回答 2

1

我已经解决了这个问题。我知道,我不是返回集合中的所有实例,而不是与字符串不可比较/不可过滤,而是使用 WQL(不是 SQL——烦人,无 in 运算符)语句查询我想要的内容,本质上是在服务器上过滤我的结果在他们返回之前。性能显着提高。

string sql = string.Format("SELECT * From Win32_Service WHERE Name = {0}", string.Join(" OR Name =", server.TargetServices));

ManagementObjectSearcher searcher = new ManagementObjectSearcher(server.Services.Scope, new ObjectQuery()
                {
                    QueryString = sql
                });

            foreach (ManagementObject service in searcher.Get())
            {
                service.InvokeMethod("StartService", null);
                //My Target Services
            }
于 2013-07-11T20:42:10.187 回答
0

您应该首先分析您的例程,以准确发现处理时间最长的内容。是服务器的查询,是启动服务,是两者兼而有之吗?

我怀疑由于您大部分时间都在连接到远程服务器,因此您的应用程序正在等待远程服务器响应或启动它们的服务。如果您可以告诉服务器做某事而不是等待它完成,那就更好了。

ManagementObject包含几个重载,InvokeMethod其中一些是异步的。我的猜测是,您可以通过异步启动服务来改进您的应用程序,这意味着您不会等待每个服务来完成它:您只需告诉它启动,然后移动到下一个服务并启动它,等等上。通过这种方式,您的应用程序不再等待远程服务器执行此操作。

于 2013-07-11T18:00:21.887 回答