在C#中检查服务器是否可通过网络访问的快速方法

Wee*_*gee 8 c#

我有一个项目,我在多个服务器上点击一堆自定义Windows性能计数器并将它们聚合到一个数据库中.如果服务器出现故障,我想跳过它,继续我的一天.

目前我正在检查服务器是否处于活动状态,通过在DirectoryInfo共享中查看我将要在稍后的过程中查看,然后检查.Exists属性.这是我当前用于测试的代码片段:

DirectoryInfo di = new DirectoryInfo(machine.Share_Path);
if (!di.Exists)
{
    log.Warn("Could not access " + machine.Name + "! Maybe its down?");
    continue; // Skips to the next server in my loop where this snippet exists.
}
Run Code Online (Sandbox Code Playgroud)

这有效,但它很慢.di.Exists位平均需要大约68秒才能完成其工作,理想情况下我需要在一秒钟内知道服务器是否可访问.Ping也不是一种选择,因为服务器可以ping通但不能在我们的环境中"活动".

我对.NET世界仍然很新鲜,所以我对人们可以提供的任何建议持开放态度.

提前致谢.

-Weegee

Joh*_*zen 8

Ping先,稍后提问

为什么不先ping,然后再做di.Exists如果得到回复?

这将允许您在无法访问的情况下提前失败,并且不会浪费时间用于严重降低的机器.

事实上,我之前已成功使用此方法.


Paralellize

您拥有的另一个选项是对服务器上的检查和操作进行并列化,因为它们已知可用.

您可以使用该Paralell.ForEach()方法,并使用线程安全队列和简单的使用者线程来执行所需的操作.结合上面的检查方法,这可以缓解上/下检查的几乎所有瓶颈.


敲门

另一种方法是阻止所需的远程服务是否正在运行(通过直接访问其端口或通过使用WMI查询它).

由于WMI几乎总是在机器启动时运行,因此您的连接应该非常快,无论是成功还是失败.