Единственный способ сделать поток Control.Add
безопасным - это убедиться, что он вызывается из потока пользовательского интерфейса.Это также означает, что добавляемый Control
можно использовать из потока пользовательского интерфейса.
Вот функция, которая создает делегата, который может добавить к Control
из любого потока (при условии, что добавленный Control
в потоке пользовательского интерфейса в порядке).
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);