Я привел пример использования System.Windows.Threading.Dispatcher
в Windows Form в ответе на вопрос «Параллельное программирование с использованием TPL на WinForms», поскольку предыдущий ответ на ваш вопрос :
Если вы уверены, что находитесь в потоке пользовательского интерфейса (например, в обработчике button.Click), Dispatcher.CurrentDispatcher предоставляет диспетчер потоков UI, который вы можете использовать для отправки из фонового потока в пользовательский интерфейс как обычно.
blockquote>либо вводит в заблуждение, либо запутывает, либо не имеет конкретного контекста использования:
button.Click
обработчик не гарантирует, что он включен в поток пользовательского интерфейса;- , если вы не используете поток пользовательского интерфейса, по-прежнему можно использовать disparcher из потока пользовательских интерфейсов формы WinForms
. Можно получить диспетчер потока WinForm UI:
Dispatcher dispatcherUI = Dispatcher.CurrentDispatcher;
в любом обработчике событий нажатия кнопки или в другом месте (в конструкторе форм)
И затем использовать его для выполнения в пользовательском интерфейсе из других потоков, более подробно см. пример ниже в мой ответ :
private void button1_Click(object sender, EventArgs e) { Dispatcher dispUI = Dispatcher.CurrentDispatcher; for (int i = 2; i < 20; i++) { int j = i; var t = Task.Factory.StartNew (() => { var result = SumRootN(j); dispUI.BeginInvoke (new Action (() => richTextBox1.Text += "root " + j.ToString() + " " + result.ToString() + Environment.NewLine ) , null ); } ); }