保持线程等待窗体响应?

时间:2010-07-26 19:08:03

标签: c# multithreading user-interface installation locking

我有一个Windows窗体应用程序,它同时运行两个线程,UI线程在任务栏中运行。 UI线程实际上与其他进程执行完全独立的功能,但是在新用户登录到应用程序的情况下,我需要从非UI线程弹出设置窗口。

以下是我的Program.cs中的代码:

static void Main()
    {
        ThreadStart start = new ThreadStart(Waiting.wait);
        Thread waiting = new Thread(start);
        waiting.Start();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(true);
        Application.Run(TaskBarIcon.getInstance());
    }

目前,在TaskBarIcon可以完全实例化之前,必须在等待线程中完成一个配置方法的运行。这是通过来回传递锁来实现的。 我希望在配置方法处理时弹出此设置菜单,并让方法等待完成,直到设置菜单完成运行。但是,除非我直接从Application.Run()方法运行设置菜单,否则我甚至无法正确显示菜单。

我是C#的新手....可以用Java快速完成这项工作,但C#似乎做的事情不同。

非常感谢任何建议或解决方案!

badPanda

1 个答案:

答案 0 :(得分:1)

我怀疑它发生的是设置菜单表单没有在工作线程上接收Windows消息,这就是它没有显示的原因。所有表单和控件都需要消息泵才能正常工作。有多种不同的方式可以启动消息泵,但最适合您的两种方法是:

  • Application.Run
  • Form.ShowDialog

如果您在设置菜单表单上调用ShowDialog,则它应显示在工作线程上。当然,在窗体关闭之前,调用会阻塞,这样可以防止配置方法的其余部分执行,但是这可能正是你想要的。

如果您希望主UI线程(调用Application.Run的线程)等到此配置方法完成,则使用WaitHandle来指示配置任务何时完成。它可能如下所示。

static void Main() 
{ 
  var configured = new ManualResetEvent(false);
  var worker = new Thread(
    () =>
    {
       // Do some stuff here.

       CallYourConfigurationMethod();
       configured.Set() // Signal that configuration is complete.

       // Do some more stuff here.
    });
  worker.Start(); 
  configured.WaitOne();
  Application.EnableVisualStyles(); 
  Application.SetCompatibleTextRenderingDefault(true); 
  Application.Run(TaskBarIcon.getInstance()); 
}