如何使用计时器制作 运行 实时且更快的刷新方法

How to make run real time and faster refresh method with timer

我有用于使用对象标签和面板刷新网络的脚本,但在脚本中使用 'for' 的循环模式。我想要这个实时刷新 1 秒或 5 秒,但因为使用 'for' 使这个过程需要更多时间并卡住屏幕。如何更快速、更实时地求解? 谢谢

        public PosPing()
        {
            InitializeComponent();
            RefreshPOS.Tick += new EventHandler(CheckPOSUG);
            RefreshPOS.Start();

        }

        private void CheckPOSUG(object sender, EventArgs e) 
        {
            Panel[] panelUG = new Panel[]{pnlPOSUG1,pnlPOSUG2,pnlPOSUG3,pnlPOSUG4,pnlPOSUG5,pnlPOSUG6,pnlPOSUG7,pnlPOSUG8};
            Label[] LabelUG = new Label[]{lblUG1,lblUG2,lblUG3,lblUG4,lblUG5,lblUG6,lblUG7,lblUG8};
            Label[] lblSpdUG = new Label[] { lblSpdUG1, lblSpdUG2, lblSpdUG3, lblSpdUG4, lblSpdUG5, lblSpdUG6, lblSpdUG7, lblSpdUG8 };

            for (int x = 0; x < 8;x++ )
            {
                string IP = "192.168.135.1" + (x + 1).ToString();
                var ping = new Ping();
                var reply = ping.Send(IP, 10 * 1000);
                LabelUG[x].Text = "POSBMS10" + x.ToString();

                if (reply.Status == IPStatus.Success)
                {
                    lblSpdUG[x].Text = reply.RoundtripTime.ToString() + " " + "ms";
                    panelUG[x].BackColor = Color.FromName("Lime");
                }
                else 
                {
                    lblSpdUG[x].Text = "Nonaktif";
                    panelUG[x].BackColor = Color.FromName("ButtonHighlight");
                }

            }
        }

没有 a good, minimal, complete code example,很难确定如何最好地回答您的问题。但它看起来就像您正在尝试 ping 八个不同的服务器,它们由表单中的八组控件表示。

如果这是正确的,那么我同意评论者 Hans Passant 的观点,您应该改用 SendPingAsync() 方法。这将允许您异步执行 ping,而不会阻塞 UI 线程,以便您的程序可以保持响应。

因为您要处理八个不同的服务器,所以我认为您应该异步执行八个 ping。为此,我将稍微重构一下代码,将特定于服务器的循环体放入一个单独的方法中,以便每个实例可以同时 运行。

以这种方式实现它看起来像这样:

private async void CheckPOSUG(object sender, EventArgs e) 
{
    Panel[] panelUG = new Panel[]{pnlPOSUG1,pnlPOSUG2,pnlPOSUG3,pnlPOSUG4,pnlPOSUG5,pnlPOSUG6,pnlPOSUG7,pnlPOSUG8};
    Label[] LabelUG = new Label[]{lblUG1,lblUG2,lblUG3,lblUG4,lblUG5,lblUG6,lblUG7,lblUG8};
    Label[] lblSpdUG = new Label[] { lblSpdUG1, lblSpdUG2, lblSpdUG3, lblSpdUG4, lblSpdUG5, lblSpdUG6, lblSpdUG7, lblSpdUG8 };

    Task[] tasks = new Task[8];

    for (int x = 0; x < 8; x++)
    {
        tasks[x] = PingServer(x, panelUG[x], LabelUG[x], lblSpdUG[x]);
    }

    try
    {
        await Task.WhenAll(tasks);
    }
    catch (Exception e)
    {
        // handle as appropriate, e.g. log and exit program,
        // report expected, non-fatal exceptions, etc.
    }
}

async Task PingServer(int index, Panel panel, Label ugLabel, Label spdLabel)
{
    // NOTE: String concatenation will automatically convert
    // non-string operands by calling calling ToString()
    string IP = "192.168.135.1" + (index + 1);
    var ping = new Ping();
    var reply = await ping.SendPingAsync(IP, 10 * 1000);
    ugLabel.Text = "POSBMS10" + x;

    if (reply.Status == IPStatus.Success)
    {
        spdLabel.Text = reply.RoundtripTime + " ms";
        // The Color struct already has named properties for known colors,
        // so no need to pass a string to look Lime up.
        panel.BackColor = Color.Lime;
    }
    else 
    {
        spdLabel.Text = "Nonaktif";
        panel.BackColor = Color.FromName("ButtonHighlight");
    }
}