我在后台线程中的静态类中,但是我想创建一个新的GUI组件,为此我需要应用程序的主线程来执行该方法。
我该怎么做?
[注意我不认为我可以使用InvokeRequired作为静态类而不是gui]
大卫
答案 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;
}));