【问题标题】:Splash screen + Main window启动画面 + 主窗口
【发布时间】:2010-11-03 21:32:03
【问题描述】:

我有一个 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

知道我能做什么吗?

这是我的 showsplash 函数:

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

【问题讨论】:

  • 在您的示例中包含线程和后台工作人员代码。
  • 遵循异常消息中的建议。
  • 由于显示启动画面时出现问题,您应该发布ShowSplash()的实现,以便我们更好地了解它如何最终启动第二个消息循环。
  • 在原帖中查看我的splash实现(已编辑)

标签: c# multithreading synchronization


【解决方案1】:

两种解决方案:

  1. 不用Application.Run,只需创建一个新的表单实例,然后调用ShowDialog。在调用ShowDialog() 之后将new MyCabApplication&lt;MyMainWorkItem, MDIParentForm&gt;().Run(); 移出启动屏幕。如果不应始终运行此代码,您可以检查启动画面的属性。
  2. 不要使用Application.Run(Form),而是使用Application.Run(ApplicationContext)。您需要创建一个新的ApplicationContext 并将您的代码移到那里。

解决方案 1 更简单。

【讨论】:

    【解决方案2】:

    听起来像 MyCabApplication 扩展了 Application。 Run 方法通过启动处理窗口消息的消息循环来启动 WinForm 应用程序。

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

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

    【讨论】:

    • 你是什么意思?但是 CAB 最后用 MDIParentForm() 做了什么
    猜你喜欢
    • 2019-08-22
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    相关资源
    最近更新 更多