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
相关产品推荐
相关产品推荐

