制作控件.添加线程安全的方法调用
本文关键字:方法 调用 安全 线程 控件 添加 | 更新日期: 2023-09-27 18:07:05
假设我有以下代码:
public void Inject(Form subform)
{
this.tabControl1.TabPages[1].Controls.Add(subform);
this.Refresh();
}
如何使用Control.Invoke
将Controls.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);