假设我有以下代码:
public void Inject(Form subform)
{
this.tabControl1.TabPages[1].Controls.Add(subform);
this.Refresh();
}
如何使用Controls.Add()
将Control.Invoke
来电转换为线程安全通话?
答案 0 :(得分:3)
使Control.Add
线程安全的唯一方法是确保从UI线程调用它。这也意味着可以从UI线程中使用添加的Control
。
这是一个函数,虽然它产生一个委托,可以从任何线程添加到Control
(假设添加的Control
在UI线程上是正常的。)
public Action<Control> GetAddControl(this Control c)
{
var context = SynchronizationContext.Current;
return (control) =>
{
context.Send(_ => c.Controls.Add(control), null);
};
}
然后对于给定的Control
,您可以将生成的委托传递给任何线程。
// From UI thread
Action<Control> addControl = c.GetAddControl();
// From background thread
addControl(subForm);