启动画面+主窗口

时间:2010-11-03 21:32:04

标签: c# multithreading synchronization

我有一个C#应用程序,当我在加载主窗口之前使用启动画面时遇到多线程/后台工作者会遇到麻烦。

我的代码看起来像这样:

[STAThread]
private static void Main()
{

.. do some stuff

ShowSplash(); // where i show a splash screen and load some stuff

...

作为ShowSplash的最后一步,我执行以下操作:

new MyCabApplication<MyMainWorkItem, MDIParentForm>().Run(); -- where i load the form through cab.

问题在于,当我这样做时,我得到以下异常:

在单个线程上启动第二个消息循环不是有效操作。请改用Form.ShowDialog

知道我该怎么办?

这是我的showplash功能:

 private static DialogResult ShowSplash(AutoResetEvent controller)
 {
     // create and register splash screen
     splashScreen = new PointSplashScreen();
     Application.Run(splashScreen);
     return DialogResult.OK;
 }

2 个答案:

答案 0 :(得分:2)

两种解决方案:

  1. 只需创建表单的新实例,然后调用Application.Run,而不是使用ShowDialog。呼叫new MyCabApplication<MyMainWorkItem, MDIParentForm>().Run();后,将ShowDialog()移到“启动画面”之外。如果不能始终运行此代码,则可以检查启动画面的属性。
  2. 使用Application.Run(ApplicationContext)而不是Application.Run(Form)。您需要创建一个新的ApplicationContext并将代码移到那里。
  3. 解决方案1更容易。

答案 1 :(得分:1)

听起来像MyCabApplication延伸ApplicationRun方法通过启动处理窗口消息的消息循环来启动WinForm应用程序。

因为您已经在显示UI,所以已经有一个消息循环正在运行,因此您无法启动另一个消息循环。要显示主表单,请创建一个新表单并调用Show()

var form = new MainForm();
form.Show();