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

C# 在没有控件的情况下使用invoke,c#,multithreading,winforms,events,C#,Multithreading,Winforms,Events,我有一个组件(System.ComponentModel.Component) 此组件从另一个线程接收事件。通常我会使用这个模式在GUI线程中执行这个代码 private void handle_Event(object sender, EventArgs e) { var control = this.Button1; if (control.InvokeRequired) control.Invoke(() => DoSomething()); e

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

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

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

然而,在这种特殊情况下,我没有控制权。如何做到这一点?

使用Dispatcher在GUI线程中运行代码……希望我能解决您的问题

private void handle_Event(object sender, EventArgs e)
{
    this.Button1.Dispatcher.Invoke(
    DispatcherPriority.Normal, (Action)() => {
            DoSomething();
   });
}
请检查语法错误:|

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

下面是一个简单的程序来演示:

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);
}

不能直接从组件执行此操作。您将需要对控件的引用,或者更好的是SychronizationContext,以便能够调用GUI线程上的调用。在构造函数中复制SynchronizationContext.Current。稍后使用它的Post()方法。但是OP注意到没有GUI。我觉得,如果有一个按钮(Button1),那么肯定有一个GUI,它的调度程序肯定会将我链接到它各自的GUI线程……看起来很有希望,我会尝试一下