【问题标题】:Keep thread waiting on windows form response?让线程等待 Windows 表单响应?
【发布时间】:2010-07-26 19:08:02
【问题描述】:

我有一个 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# 的处理方式似乎不同。

任何建议或解决方案将不胜感激!

坏熊猫

【问题讨论】:

  • 但 C# 的做法似乎有所不同 >> 没错,虽然方式相似,但如果你开另一条路,很容易迷路。

标签: c# multithreading user-interface installation locking


【解决方案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()); 
} 

【讨论】:

  • 谢谢!这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2011-10-23
  • 1970-01-01
  • 2011-02-19
相关资源
最近更新 更多