【发布时间】:2014-04-28 11:16:40
【问题描述】:
我知道有很多关于我的问题的话题,但我找不到适合我的情况的解决方案...
我有一个面板,我在运行时在其上添加了控件,我尝试了这段代码,但它对我没有帮助,并且错误提示:
跨线程操作无效控件“panel1”从线程访问 除了创建它的线程
这是我的代码:
public void AddControlToPanel(Panel panel, Control ctrl)
{
if (panel.InvokeRequired)
{
panel.Invoke((MethodInvoker)delegate { AddControlToPanel(panel, ctrl); });
return;
}
else
panel.Controls.Add(ctrl);
}
我这样称呼它:
AddControlToPanel(panel1, ctrl);
【问题讨论】:
-
据我所知,这应该是正确的。
panel.Invoke(...)被调用了吗? -
你为什么要为此使用递归调用?为什么不直接调用 panel.Invoke((MethodInvoker)delegate { panel.Controls.Add(ctrl); });如果 panel.InvokeRequired 为真?
-
您的控件是在与 panel1 相同的线程上创建的吗?如果不是,那是你的问题。
-
您的表单是否在与 UI 线程不同的线程上创建?
-
@aEkBKF winforms 控件具有线程关联性,因此创建它们的线程很重要,即调用 new 时正在运行的线程。如果 panel1 是在主线程中创建的,而 ctrl 是在后台线程中创建的,则它们不能一起使用,因为它们由不同的线程“拥有”。
标签: c# thread-safety invoke