我为我的 WinForm 应用程序编写了一点代码,通过更改颜色编码的标签控件来显示运行它的计算机的连接状态。
在我的表单中,我有以下代码:
public frmShell()
{
InitializeComponent();
this.stateManager = new StateManager();
}
private void frmShell_Load(object sender, EventArgs e)
{
// Subscribe to events
this.stateManager.ConnectionChange += new StateManager.ConnectionChangeHandler(ConnectionHasChanged);
}
private void ConnectionHasChanged(object sender, ConnectionChangeEventArgs e)
{
if (e.ConnectionType == ConnectionType.Network)
{
if (e.ConnectionState == ConnectionState.Connected)
{
SetLabelOnline();
}
else
{
SetLabelOffline();
}
}
}
private void SetLabelOffline()
{
labelConnectivityValue.Text = "Offline";
labelConnectivityValue.ForeColor = Color.Red;
}
private void SetLabelOnline()
{
labelConnectivityValue.Text = "Online";
labelConnectivityValue.ForeColor = Color.Green;
}
每次我禁用网络适配器来测试我的代码时,我都会在SetLabelOnline()或SetLabelOffline()方法中收到以下错误:
跨线程操作无效:控件“labelConnectivityValue”从创建它的线程以外的线程访问。
1. 我不明白为什么我的代码会被认为是无效的跨线程操作。此外,我只是以完全相同的方式重复使用我之前在另一个 WinForm 应用程序中使用的代码。
2. 我不知道如何解决这个问题,特别是考虑到我想要实现的目标似乎非常基本。
注意:状态管理器中的代码只是一个计时器,它经常检查连接的状态,并在连接属性必须更改时触发事件,即连接状态是否已更改