My Goal
我希望有一个主处理线程(非GUI),并能够根据需要在它们自己的后台线程中剥离GUI,并让我的主非GUI线程继续工作。换句话说,我希望我的主非GUI线程成为GUI线程的所有者,而不是相反。我不确定这在Windows窗体(?)中是否可行。
背景
我有一个基于组件的系统,其中控制器动态加载程序集,并实例化和运行使用单个方法DoStuff()
实现公共IComponent
接口的类。
加载的组件是通过xml配置文件和添加包含不同IComponent
实现的新程序集来配置的。组件向主应用程序提供实用程序功能。当主程序在做它自己的事情时,例如控制一座核电站,组件可能正在执行实用任务(在它们自己的线程中),例如清理数据库、发送电子邮件、在打印机上打印滑稽笑话等等。我想要的是,有这些组件之一能够显示图形用户界面,例如与所述电子邮件发送组件的状态信息。
整个系统的生命周期如下所示
DoStuff()
来初始化它,并让它在自己的threads.如果组件在DoStuff()
中触发图形用户界面,我还无法成功执行第3点。它只是简单地暂停,直到GUI关闭。直到GUI关闭,程序才前进到第4点。
如果允许这些组件启动自己的Windows窗体GUI,那就太好了。
Problem
当组件试图在DoStuff()
中启动图形用户界面时(确切的代码行是在组件运行Application.Run(theForm)
时),该组件以及我们的系统在Application.Run()
行“挂起”,直到图形用户界面关闭。嗯,正如预期的那样,刚刚启动的GUI工作得很好。
组件示例。一个与图形用户界面没有任何关系,而第二个则打开了一个可爱的窗口,里面有粉红色的毛绒绒的小兔子。
public class MyComponent1: IComponent
{
public string DoStuff(...) { // write something to the database }
}
public class MyComponent2: IComponent
{
public void DoStuff()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form());
// I want the thread to immediately return after the GUI
// is fired up, so that my main thread can continue to work.
}
}
我已经试过了,但没有成功。即使当我试图在它自己的线程中启动GUI时,执行也会暂停,直到GUI关闭。
public void DoStuff()
{
new Thread(ThreadedInitialize).Start()
}
private void ThreadedInitialize()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form());
}
是否可以关闭图形用户界面并在Application.Run()
之后返回
https://stackoverflow.com/questions/2872
复制相似问题