четверг, 3 февраля 2011 г.

многопоточность в wpf

Как и в WinForms в WPF взаимодействовать с элементами на форме может только основной поток.
Чтобы вывести в текстбокс значение из другого потока в 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

Немного поигрался с потоками и написал такой пример