【发布时间】:2023-11-30 20:58:01
【问题描述】:
我想持续检查仪器的连接性。这些仪器通过 LAN 连接。
我在无限循环中对它们执行 ping 操作。几秒钟后,我遇到了蓝屏,系统重新启动。
private async void checkingDevice()
{
await Task.Run(() =>
{
do
{
Panel selectedPanel;
multicastPing.send();
foreach (var device in (Device[])Enum.GetValues(typeof(Device)))
{
selectedPanel = (Panel)this.Controls.Find((device).ToString(), true)[0];
if (multicastPing.check(device.ToString()))
selectedPanel.BackgroundImage = Image.FromFile(Configs.imagesUrl + "enable\\" + selectedPanel.AccessibleName + ".png");
else
selectedPanel.BackgroundImage = Image.FromFile(Configs.imagesUrl + "disable\\" + selectedPanel.AccessibleName + ".png");
}
} while (!flag);
// TODO
// delete instrument object after using in this snippet code
});
}
public bool send()
{
foreach (var device in (Device[])Enum.GetValues(typeof(Device)))
replyDictionary[device.ToString()] = sendDictionary[device.ToString()].Send(Configs.instrumentSpecification[device.ToString()].ip).Status;
return true;
}
【问题讨论】:
-
蓝屏是...奇怪但是:不要从另一个线程访问 UI(似乎是 WinForms)。另外:不要在每次 ping 时创建新图像...在循环外使用
Image.FromFile()两次并重复使用它们(此外,如果状态没有改变,则无需更改图像)。 -
“蓝屏和系统被重新启动” - 你确定你不只是意味着你有一个异常窗口,上面写着cross thread operation exception?两者之间有很大的不同。纯 .NET 代码不太可能导致蓝屏
-
不,我知道在主线程中创建的变量不能被另一个线程访问。这项工作导致了跨线程操作错误。但是我的应用程序导致系统遇到蓝屏并重新启动。当我从代码中删除相应的行 (multicastPing.send();) 时,这个问题就解决了。
标签: c# networking ping