проще всего использовать SynchronizationContext. Все .Net GUI framework'и (а их 2 — WinForms и WPF) устанавливают свой контекст синхронизации. Захватите его в UI потоке через статическое свойство Current и используйте для выполнения кода в контексте UI из других потоков при помощи простых методов Post и Send (синхронно и асинхронно по аналогии с Post/SendMessage в Win32).