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

时间:2013-12-19 12:22:41

标签: c# multithreading winforms events

我有一个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();
}

然而,在这个特殊情况下,我没有控制权。我该怎么做?

2 个答案:

答案 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();
   });
}

请检查语法错误:|