You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ping往返时间超过50ms时如何修改PictureBox的显示图片

实现方案

你只需要把原来的二分支三元判断拆成三层判断逻辑,同时利用PingReply类自带的RoundtripTime属性获取往返时间即可,具体修改如下:

首先建议先把图片提前全局缓存,避免每次循环都重复读取本地文件,减少不必要的IO开销:

// 提前在类内部定义三个图片的全局缓存,不要每次循环都读文件
private readonly Image _greenCheck = Image.FromFile(@"C:\Users\PC\Downloads\green.png");
private readonly Image _redCross = Image.FromFile(@"C:\Users\PC\Downloads\red.png");
// 新增黄色感叹号图片缓存
private readonly Image _yellowWarn = Image.FromFile(@"C:\Users\PC\Downloads\yellow.png");

之后修改backgroundWorker1_DoWork里的判断逻辑,同时加上异常捕获避免程序意外崩溃:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    Thread.Sleep(500);
    Parallel.For(0, ipAddress.Count(), (i, loopState) =>
    {
        Ping ping = new Ping();
        try
        {
            PingReply pingReply = ping.Send(ipAddress[i].ToString());
            this.BeginInvoke((Action)delegate ()
            {
                if (pingReply.Status != IPStatus.Success)
                {
                    // ping失败显示红叉
                    pictureboxList[i].BackgroundImage = _redCross;
                }
                else
                {
                    // ping成功时判断RTT是否超过阈值
                    pictureboxList[i].BackgroundImage = pingReply.RoundtripTime > 50 ? _yellowWarn : _greenCheck;
                }
            });
        }
        catch
        {
            // 捕获ping过程中抛出的异常(如目标主机不可达、请求超时等),统一显示红叉
            this.BeginInvoke((Action)delegate ()
            {
                pictureboxList[i].BackgroundImage = _redCross;
            });
        }
    });
}

注意事项

  • 若需要自定义ping超时阈值,可使用ping.Send()的重载方法传入超时毫秒数,默认超时时间为5秒
  • 窗体关闭时请手动释放三个图片对象的GDI资源,避免内存泄漏
  • 50ms的RTT判定阈值可根据实际业务需求自行调整

内容的提问来源于stack exchange,提问作者user14568805

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:21:03