2010-07-26 85 views
1

我有一个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

+0

*但是C#似乎以不同的方式做事情* >>真的,虽然方式相似,但如果您驾驶其他路线,很容易在路上迷路。 – Abel 2010-07-26 19:11:17

回答

1

我怀疑它是什么情况是,设置菜单的形式是不工作线程接收窗口的消息,这就是为什么它没有显示出来。所有表格和控件都需要消息泵才能正常工作。有得到一个消息泵启动的各种不同的方式,但两个最适用于你:

  • 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()); 
} 
+0

谢谢!这正是我所需要的。 – badpanda 2010-07-26 20:06:29