Как вызвать действие <>, изменяющее управление winforms - PullRequest
1 голос
/ 29 марта 2011

У меня есть следующая функция

    private void UnsubscribeSubscribe(Action action)
    {
        action.BeginInvoke(action.EndInvoke, null);
    }

Всякий раз, когда я выполняю действие, которое изменяет мой источник данных управления, ничего не происходит.Я знаю, что действие вызывается, потому что выполняемый запрос возвращает результаты.Я читал, что вы можете изменять элементы управления winform только из того потока, в котором они были добавлены.Как я могу сделать эту работу?

Например, запуск UnsubscribeSubscribe (() => {Foobar.DataSource = GetResults ()});

GetResults() будет работать правильно, но источник данныхостанется без изменений.

Ответы [ 3 ]

5 голосов
/ 29 марта 2011

Вам необходимо вызвать делегата в потоке, который создал базовый дескриптор элемента управления. Control.BeginInvoke используется только для этого.

3 голосов
/ 29 марта 2011

Вы используете неправильный метод. Метод BeginInvoke () делегата всегда запускает цель делегата в потоке потоков. Яд для пользовательского интерфейса. Вам нужно использовать Control.BeginInvoke (). Как и метод BeginInvoke формы. Несмотря на аналогичное имя, он не имеет ничего общего с методом BeginInvoke () делегата . Во-первых, вам не нужно (и не следует) вызывать EndInvoke ().

2 голосов
/ 29 марта 2011

если вам нужно выполнить действие в потоке пользовательского интерфейса из другого потока, чем в потоке графического интерфейса, тогда вам следует использовать метод Invoke, подобный этому (этот пример для текстового поля - от msdn ):

private void SetText(string text)
{
   // InvokeRequired required compares the thread ID of the
   // calling thread to the thread ID of the creating thread.
   // If these threads are different, it returns true.
  if (this.textBox1.InvokeRequired)
  { 
    SetTextCallback d = new SetTextCallback(SetText);
    this.Invoke(d, new object[] { text });
  }
  else
  {
    this.textBox1.Text = text;
  }
}

Существует также другой подход, использующий SynchronizationContext класс - вы можете прочитать об использовании здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...