Чтобы вывести в текстбокс значение из другого потока в WinForms используется выражение:
this.Invoke((MethodInvoker)(() => { tb.Text = "новое значение"; }));
В WPF вместо метода Control.Invoke есть метод Window.Dispather.Invoke:
this.Dispatcher.Invoke((Action)(() => { tb.Text = "новое значение"; }));
Небольшое пояснение. Выражение () => { ... } означает анонимный делегат без параметров. Это тоже самое что определить где-то в коде функцию и вместо выражения указать ее имя.
Удивительно, но оказывается можно без особых усилий писать оконные приложения, в которых у каждого окна свой главный поток!
Running WPF Application with Multiple UI Threads
Немного поигрался с потоками и написал такой пример