在没有控件的情况下使用invoke

我有一个Component(System.ComponentModel.Component)

该组件从另一个Thread接收事件。 通常我会使用这种模式在GUI线程中执行此代码

private void handle_Event(object sender, EventArgs e) { var control = this.Button1; if (control.InvokeRequired) control.Invoke(() => DoSomething()); else DoSomeThing(); } 

但是,在这种特殊情况下,我没有控制权。 我该怎么做呢?

如果将当前的SynchronizationContext传递给后台线程,则可以要求它发布 (begininvoke)或发送 (调用)前台线程所需的代码。

这是一个简单的LINQPad程序来演示:

 void Main() { using (var fm = new Form()) { var btn = new Button(); fm.Controls.Add(btn); btn.Click += HandleClick; Thread.CurrentThread.ManagedThreadId.Dump("Main thread"); fm.ShowDialog(); } } public static void HandleClick(object sender, EventArgs e) { var synchronizationContext = SynchronizationContext.Current; var thread = new Thread(new ThreadStart( () => BackgroundMethod(synchronizationContext))); thread.Start(); } public static void BackgroundMethod(SynchronizationContext context) { context.Post(state => { Thread.CurrentThread.ManagedThreadId.Dump("Invoked thread"); }, null); } 

使用Dispatcher在GUI线程中运行代码…希望我的问题正确。

 private void handle_Event(object sender, EventArgs e) { this.Button1.Dispatcher.Invoke( DispatcherPriority.Normal, (Action)() => { DoSomething(); }); } 

请检查语法错误:|