我有一个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();
}
然而,在这个特殊情况下,我没有控制权。我该怎么做?
答案 0 :(得分:2)
如果将当前SynchronizationContext传递给后台线程,您可以要求它Post(begininvoke)或Send(调用)前台线程所需的代码。
这是一个简单的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);
}
答案 1 :(得分:-2)
使用Dispatcher在GUI线程中运行代码...希望我的问题正确。
private void handle_Event(object sender, EventArgs e)
{
this.Button1.Dispatcher.Invoke(
DispatcherPriority.Normal, (Action)() => {
DoSomething();
});
}
请检查语法错误:|