gpt4 book ai didi

UserControls的c#跨线程错误

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:42 24 4
gpt4 key购买 nike

这是我的情况:

我在主线程上实例化了一个 c# 用户控件,但它没有添加到表单中。

//global declaration
usercontrol1 datacontrol;

constructor()
{
.......
datacontrol = new usercontrol1();
........
}

然后我有一个异步后台线程,它触发一个由实例化数据控件处理的事件。事件处理程序有:

if(InvokeRequired){BeginInvoke(..);}

这应该可以防止进行任何跨线程调用。但是,当它被调用时,InvokeRequired 为 false,因此不会在正确的线程上调用处理程序。所以在处理程序中,当我尝试 this.labelname.text ="blah"时,会抛出一个跨线程异常。

但是,如果我将控件添加到主窗体上的面板并将其删除,则允许后台线程触发事件。处理程序进入,但这次“InvokeRequired”设置为 true,因此它在主线程上下文中正确调用自身以避免异常。

有人可以向我解释为什么将它添加到面板然后删除它的行为可以修复错误吗?

表单没有 onLoad 事件,因此所有内容都应该在不绘制的情况下正确实例化。

谢谢!斯蒂芬妮

最佳答案

这可能是因为尚未创建控件的句柄。如果您在构造函数中引用 dataform.Handle,它应该创建句柄并适当设置线程 ID,因此 InvokeRequired 稍后将返回 true。

您还可以使用 CreateControl 强制创建句柄,但前提是控件可见。

关于UserControls的c#跨线程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3578706/

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