C# 创建控件。添加方法调用线程安全
假设我有以下代码:C# 创建控件。添加方法调用线程安全,c#,winforms,thread-safety,invoke,C#,Winforms,Thread Safety,Invoke,假设我有以下代码: public void Inject(Form subform) { this.tabControl1.TabPages[1].Controls.Add(subform); this.Refresh(); } 如何使用Control.Invoke将控件.Add()调用转换为线程安全调用?使控件.添加线程安全的唯一方法是确保从UI线程调用它。这也意味着要添加的控件可以从UI线程使用 // From UI thread Action<Control>
public void Inject(Form subform)
{
this.tabControl1.TabPages[1].Controls.Add(subform);
this.Refresh();
}
如何使用
Control.Invoke
将控件.Add()
调用转换为线程安全调用?使控件.添加线程安全的唯一方法是确保从UI线程调用它。这也意味着要添加的控件可以从UI线程使用
// From UI thread
Action<Control> addControl = c.GetAddControl();
// From background thread
addControl(subForm);
下面是一个函数,它生成一个委托,可以从任何线程添加到控件
(假定添加的控件
在UI线程上是正常的)
它引发了一个异常:“跨线程操作无效:从上下文.Send
中的线程访问控件'Form2'。因此,从UI线程看来,表单毕竟是不可用的。我将切换逻辑,让我的main去获取表单对象,而不是交给它,并处理访问其子表单的其他线程的复杂性。我只是希望我能将子表单“欺骗”到主表单中,所以它仍然是其原始线程的一级公民。但无论如何,我要将其标记为已接受。非常感谢;如果你对表单
实例非常小心,并且避免做任何调用CreateControl
的事情,你可以在后台线程上创建它,然后将它移动到UI htread。这似乎是一个新手问题,但是,哪里是声明操作扩展方法的正确位置,因为在UI线程上声明它,该方法应该是静态的,当在UI静态类编译器上声明时会产生错误,c在当前上下文中不存在?JaredPar,你能提供一个实现这个函数的例子吗,因为我需要它。
// From UI thread
Action<Control> addControl = c.GetAddControl();
// From background thread
addControl(subForm);