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);