RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 762071
Accepted
MiT
MiT
Asked:2020-12-23 01:23:47 +0000 UTC2020-12-23 01:23:47 +0000 UTC 2020-12-23 01:23:47 +0000 UTC

如何进行永久服务器状态检查(C#)

  • 772

所以,有一个服务器,你需要不断地、异步地知道它的状态......

这样试了,不行

Thread pingThread = new Thread(_client_PingServer);
pingThread.Start();

private void _client_PingServer()
        {
            try
            {
                System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
                System.Net.NetworkInformation.PingReply pingReply = ping.Send(settingsControl1.txtIPAddress.Text);
                if (pingReply.RoundtripTime <= 70 && pingReply.RoundtripTime >= 1)
                {
                    labelServerStatus.ForeColor = System.Drawing.Color.Green;
                }
                else if (pingReply.RoundtripTime >= 70 && pingReply.RoundtripTime <= 120)
                {
                    labelServerStatus.ForeColor = System.Drawing.Color.Orange;
                }
                else if (pingReply.RoundtripTime >= 120)
                {
                    labelServerStatus.ForeColor = System.Drawing.Color.Red;
                }
                else if (pingReply.RoundtripTime == 0)
                {
                    labelServerStatus.Text = @"Offline";
                }
                if (pingReply.RoundtripTime != 0)
                {
                    labelServerStatus.Text = pingReply.RoundtripTime.ToString();
                }
            }
            catch (PingException)
            {
                labelServerStatus.ForeColor = System.Drawing.Color.Red;
                labelServerStatus.Text = @"Offline";
            }
        }

你的想法?

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    rdorn
    2020-12-23T06:20:00Z2020-12-23T06:20:00Z

    首先,让我们弄清楚为什么它不起作用。首先,因为您正在从另一个线程访问 UI 控件的属性。这是不可能的,UI 元素只能从创建和处理它们的线程中获得,因为 他们需要收听系统消息并响应用户操作。

    第二个原因是你的方法代码,即使修复之前的错误不是循环的,所以它只会执行一次是有道理的。

    定期执行某些操作的最简单方法是使用计时器,因为 一个简单的循环在这里不起作用。

    该类Ping具有执行相同操作的异步Ping.SendAsync方法。就像您使用的常规一样,Ping.Send仅用于异步执行。主机不可用时 Windows 的标准 ping 超时为 4 秒。(证明),所以如果重要,您将不得不选择另一个重载Ping.SendAsync,允许您在调用方法时在参数中指定超时值。

    现在让我们将所有内容放在一起以获得所需的结果。对于 WinForms 应用程序,我们将使用System.Windows.Forms.Timer作为计时器,因为 一方面,我们需要能够使用控件的属性,特别是这个计时器在 UI 线程中执行处理程序,另一方面,SendAsync我们只需要正确调用它,因为 它已经使用异步。

    添加一个计时器并设置它的参数在代码示例中有很好的记录,所以在这里我将只展示Timer.Tick事件处理程序,它将完成所有工作。

    //помечаем обработчик ключевым словом async, чтобы получить возможность
    //внутри вызывать асинхронные методы через await
    async private void PingByTimer(object sender, EventArgs args) 
    {
        try
        {
            var ping = new System.Net.NetworkInformation.Ping();
            //асинхронно выполняем Ping
            var pingReply = await ping.SendPingAsync(settingsControl1.txtIPAddress.Text);
            //после получения результата мы снова в UI-потоке и продолжаем.
            if (pingReply.RoundtripTime <= 70 && pingReply.RoundtripTime >= 1)
            {
                labelServerStatus.ForeColor = System.Drawing.Color.Green;
            }
            else if (pingReply.RoundtripTime > 70 && pingReply.RoundtripTime <= 120)
            {
                labelServerStatus.ForeColor = System.Drawing.Color.Orange;
            }
            else if (pingReply.RoundtripTime > 120)
            {
                labelServerStatus.ForeColor = System.Drawing.Color.Red;
            }
            else if (pingReply.RoundtripTime == 0)
            {
                labelServerStatus.Text = @"Offline";
            }
            if (pingReply.RoundtripTime != 0)
            {
                labelServerStatus.Text = pingReply.RoundtripTime.ToString();
            }
        }
        catch (PingException)
        {
            labelServerStatus.ForeColor = System.Drawing.Color.Red;
            labelServerStatus.Text = @"Offline";
        }
    }
    

    它仍然使用此方法订阅事件Tick并激活计时器,例如,在成功首次连接到服务器之后。如您所见,代码中的更改很少,但一切正常。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5