制作控件.添加线程安全的方法调用

本文关键字:方法 调用 安全 线程 控件 添加 | 更新日期: 2023-09-27 18:07:05

假设我有以下代码:

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

如何使用Control.InvokeControls.Add()调用转换为线程安全调用?

制作控件.添加线程安全的方法调用

使Control.Add线程安全的唯一方法是确保它从UI线程调用。这也意味着添加的Control可以从UI线程中使用。

这是一个函数,它产生一个委托,可以从任何线程添加Control(假设添加的Control在UI线程上是OK的)。

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