c#回调主线程

时间:2010-10-13 22:30:37

标签: c# .net winforms

我在后台线程中的静态类中,但是我想创建一个新的GUI组件,为此我需要应用程序的主线程来执行该方法。

我该怎么做?

[注意我不认为我可以使用InvokeRequired作为静态类而不是gui]

大卫

3 个答案:

答案 0 :(得分:4)

为了澄清这个问题,你在辅助线程上有一个静态类,你希望你的主线程从这个类产生一个UI元素。

为了做到这一点,您需要在静态类中设置一个事件,然后让您的UI监听该事件。即使它的静电也可以接线。 在您的事件处理代码中,您可以调用主UI调用来实际生成UI元素。

class Program
{
    static void Main(string[] args)
    {
        DoSomething.OnNeedsUI += new EventHandler<EventArgs>(DoSomething_OnNeedsUI);
        Thread t = new Thread(new ThreadStart(DoSomething.Work));
        t.Start();
    }

    private static void DoSomething_OnNeedsUI(object sender, EventArgs e)
    {
        Console.Write("Call Back Handled Here");
    }
}


public static class DoSomething
{
    public static void Work()
    {
        for (int i = 0; i < 10; i++)
        {

            Thread.Sleep(5000);
            // Raise your Event so the tUI can respond
            RaiseOnNeedsUI();
        }
    }

    //  Create a Customer Event that your UI will Register with
    public static event EventHandler<EventArgs> OnNeedsUI;
    private static void RaiseOnNeedsUI()
    {
        if (OnNeedsUI != null)
            OnNeedsUI(null, EventArgs.Empty);
    }

答案 1 :(得分:2)

您的静态类需要引用在UI线程上创建的某个实例类,最好是控件。由于您正在创建一个控件,因此您可能会为该控件设置一些窗体/窗口,因此无论如何您都需要一个引用。您可以使用表单的Invoke()方法来编组将在UI线程上创建控件的调用。

答案 2 :(得分:1)

您可以将UI控件的实例传递给该方法(然后对该方法进行调用),否则将您想要的内容包装为委托;例如:

static void DoStuff(..., Action<string> updateMessage) {
    ...
    //loop
    updateMessage(currentState);
}

使用:

DoStuff(..., msg => this.Invoke((MethodInvoker)delegate{
    this.Text = msg;
}));