Легко:
MainWindow.myInstance.Dispatcher.BeginInvoke(new Action(delegate() {MainWindow.myInstance.myTextBox.Text = "some text";});
WHERE MainWindow.myInstance - это открытая статическая переменная, установленная на экземпляр MainWindow (должна быть установлена в конструкторе и будет нулевой, пока экземпляр не будет создан).
Хорошо, это много в одной строке, позвольте мне перейти по этому вопросу:
Когда вы хотите обновить элемент управления пользовательского интерфейса, вы, как вы говорите, должны сделать это из потока пользовательского интерфейса. Существует способ передачи делегата (метода) в поток пользовательского интерфейса: Dispatcher. Я использовал MainWindow.myInstance, который (как и все компоненты пользовательского интерфейса) содержит ссылку на Dispatcher - вы можете альтернативно сохранить ссылку на Dispatcher в своей собственной переменной:
Dispatcher uiDispatcher = MainWindow.myInstance.Dispatcher;
Получив Dispatcher, вы можете либо Invoke () из BeginInvoke () передать делегат для запуска в потоке пользовательского интерфейса. Единственное отличие заключается в том, что Invoke () будет возвращаться только после запуска делегата (т. Е. В вашем случае был установлен текст TextBox), тогда как BeginInvoke () будет возвращаться немедленно, так что ваш другой поток, из которого вы вызываете, может продолжаться (Dispatcher будет работать как можно скорее, ваш делегат, который, скорее всего, сразу будет).
Я передал анонимного делегата выше:
delegate() {myTextBox.Text = "some text";}
Бит между {} является блоком метода. Это называется анонимным, потому что создается только один и у него нет имени, но я мог бы создать экземпляр делегата:
Action myDelegate = new Action(UpdateTextMethod);
void UpdateTextMethod()
{
myTextBox.Text = "new text";
}
Затем прошло это:
uiDispatcher.Invoke(myDelegate);
Я также использовал класс Action, который является встроенным делегатом, но вы могли бы создать свой собственный - вы можете прочитать больше о делегатах в MSDN, так как это немного не по теме.