使Controls.Add方法调用线程安全

时间:2011-08-31 17:39:10

标签: c# winforms thread-safety invoke

假设我有以下代码:

public void Inject(Form subform)
{
    this.tabControl1.TabPages[1].Controls.Add(subform);
    this.Refresh();
}

如何使用Controls.Add()Control.Invoke来电转换为线程安全通话?

1 个答案:

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