Создание вызова метода Controls.Add потокобезопасным - PullRequest
1 голос
/ 31 августа 2011

Допустим, у меня есть следующий код:

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

Как я могу преобразовать вызов Controls.Add() в потокобезопасный вызов, используя Control.Invoke?

1 Ответ

3 голосов
/ 31 августа 2011

Единственный способ сделать поток 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...