Как опубликовать сообщение пользовательского интерфейса из рабочего потока в C # - PullRequest
2 голосов
/ 15 марта 2011

Я пишу простое приложение winforms в C #. Я создаю рабочий поток и хочу, чтобы главное окно реагировало на протектор, заканчивая свою работу - просто измените текст в текстовом поле testField.Text = "Ready" Я пробовал события и обратные вызовы, но все они выполняются в контексте вызывающего потока, и вы не можете сделать пользовательский интерфейс из рабочего потока.

Я знаю, как это сделать на C / C ++: вызвать PostMessage из рабочего потока. Я предполагаю, что мог бы просто вызвать Windows API из C #, но разве нет более конкретного решения для .NET?

Ответы [ 5 ]

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

В обратном вызове события из завершенного потока используйте шаблон InvokeRequired, как показано в различных ответах на этот пост SO.

C #: автоматизация шаблона кода InvokeRequired

Другим вариантом будет использование компонента BackgroundWorker для запуска вашего потока.Обработчик события RunWorkerCompleted выполняется в контексте потока, запустившего рабочий.

1 голос
/ 15 марта 2011

я обычно делаю что-то вроде этого

void eh(Object sender,
EventArgs e)
{
   if (this.InvokeRequired)
   {
      this.Invoke(new EventHandler(this.eh, new object[] { sender,e });
       return;
    }  
    //do normal updates
}
0 голосов
/ 15 марта 2011

Вы можете использовать функцию Invoke формы.Функция будет запущена в потоке пользовательского интерфейса.

EX:

...
MethodInvoker meth = new MethodInvoker(FunctionA);
form.Invoke(meth);
....

void FunctionA()
{
   testField.Text = "Ready". 
}
0 голосов
/ 15 марта 2011

Метод Control.Invoke () или Form.Invoke () выполняет делегат, предоставленный вами в потоке пользовательского интерфейса.

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