我的目标
我想有一个主处理线程(非GUI),并能够根据需要在自己的后台线程中分离GUI,并让我的主非GUI线程继续工作.换句话说,我希望我的主非GUI线程成为GUI线程的所有者,反之亦然.我不确定Windows Forms(?)是否可行
背景
我有一个基于组件的系统,其中控制器动态加载程序集并实例化并运行IComponent使用单个方法实现公共接口的类DoStuff().
通过xml配置文件和添加包含不同实现的新程序集来配置加载的组件IComponent.组件为主应用程序提供实用程序功能.虽然主程序正在做这件事,例如控制核电站,组件可能正在执行公用事业任务(在他们自己的线程中),例如清理数据库,发送电子邮件,在打印机上打印有趣的笑话,你有什么.我想要的是使这些组件中的一个能够显示GUI,例如具有所述电子邮件发送组件的状态信息.
整个系统的生命周期如下所示
DoStuff()以初始化它并使其在自己的线程中实现自己的生命.如果组件启动了GUI,我还没有能够成功执行第3点DoStuff().它只是暂停,直到GUI关闭.直到GUI关闭,程序才会进入第4点.
如果允许这些组件启动它们自己的Windows窗体GUI,那就太好了.
问题
当组件尝试启动GUI时DoStuff()(确切的代码行是组件运行时Application.Run(theForm)),组件以及因此我们的系统在该Application.Run()行"挂起" 直到GUI关闭.好吧,正如预期的那样,刚启动的GUI工作正常.
组件示例.一个与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.
}
}
Run Code Online (Sandbox Code Playgroud)
我试过这个没有运气.即使我尝试在其自己的线程中启动GUI,执行也会暂停,直到GUI关闭为止.
public void DoStuff()
{
new Thread(ThreadedInitialize).Start()
}
private void ThreadedInitialize()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form());
}
Run Code Online (Sandbox Code Playgroud)
是否可以分离GUI并在之后返回Application.Run()?
Ish*_*eel 13
Application.Run方法显示一个(或多个)表单并启动标准消息循环,该循环一直运行直到所有表单都关闭.除非关闭所有表单或强制关闭应用程序,否则不能强制从该方法返回.
但是,您可以将ApplicationContext(新Form()的instad)传递给Application.Run方法,ApplicationContext可以用于一次启动多个表单.您的申请只会在所有申请被关闭时结束.请看:http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx
此外,您以非模态方式显示的任何表单将继续与主表单一起运行,这将使您可以拥有多个不会相互阻塞的窗口.我相信这实际上是你想要完成的.
| 归档时间: |
|
| 查看次数: |
1010 次 |
| 最近记录: |