我有一个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 :(得分:1)
我怀疑它发生的是设置菜单表单没有在工作线程上接收Windows消息,这就是它没有显示的原因。所有表单和控件都需要消息泵才能正常工作。有多种不同的方式可以启动消息泵,但最适合您的两种方法是:
如果您在设置菜单表单上调用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());
}