gpt4 book ai didi

C# - 连接事件期间出现 "Cross-thread operation not valid"错误

转载 作者:行者123 更新时间:2023-12-03 12:49:24 25 4
gpt4 key购买 nike

我为我的 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() 方法中收到以下错误:

Cross-thread operation not valid: Control 'labelConnectivityValue' accessed from a thread other than the thread it was created on.

<强>1。我不明白为什么我的代码会被认为是无效的跨线程操作。此外,我只是以完全相同的方式重复使用我之前在另一个 WinForm 应用中使用的代码。

<强>2。我不知道如何解决这个问题,尤其是考虑到我要实现的目标似乎非常基础。

注意:statemanager 中的代码只是一个计时器,它经常检查连接状态并在必须更改连接属性时触发事件,即如果连接状态已更改

最佳答案

触发该事件的计时器或诸如此类的东西是从一个与拥有表单(及其所有控件)的线程不同的线程执行的。

这可能在早期版本的 WinForms 中“有效”,因为现在抛出异常的显式检查不存在。然而,它没有正确地工作,这就是添加这些检查的原因,以帮助人们找出他们遇到的问题。

有两种处理方法:

  1. 确保调用事件的代码未使用辅助线程。你提到了一个计时器,可能是这段代码错误地使用了错误类型的计时器。你应该调查一下。

    如果代码使用 System.Threading.Timer , 验证是否可以使用 System.Windows.Forms.Timer反而。第二个计时器使用 Winforms 系统构建的消息系统,它将在拥有表单及其控件的同一线程上调用事件。

  2. 确保事件中的代码能够应对在不同线程上执行。

执行此操作的正确方法(即上面的第 2 点)是将每个调用编码到拥有表单及其控件的同一个线程,您可以通过更改每个此类方法的 header 来完成此操作,如下所示:

private void ConnectionHasChanged(object sender, ConnectionChangeEventArgs e)
{
if (InvokeRequired)
{
Invoke(new Action(() =>
{
ConnectionHasChanged(sender, e);
}));
return;
}

if (e.ConnectionType == ConnectionType.Network)
{
...

关于C# - 连接事件期间出现 "Cross-thread operation not valid"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17506266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com