启动画面 +主窗口

发布于 2024-10-01 05:02:24 字数 797 浏览 1 评论 0原文

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

I have a C# application which runs into trouble when it comes to multi-threads / backgroundworkers when I'm using a splash screen before I load the main window.

my code look something like this:

[STAThread]
private static void Main()
{

.. do some stuff

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

...

As the last step of ShowSplash, I do the following:

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

The problem is that when I do that I get the following exception:

Starting a second message loop on a single thread is not a valid operation. Use Form.ShowDialog instead

Any idea what can I do?

Here is my showsplash function:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一身骄傲 2024-10-08 05:02:24

两种解决方案:

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

解决方案 1 更容易。

Two solutions:

  1. Instead of using Application.Run, just create a new instance of the form and then call ShowDialog. Move new MyCabApplication<MyMainWorkItem, MDIParentForm>().Run(); outside of the Splash Screen after the call to ShowDialog(). You can check properties of the Splash screen if this code should not always be run.
  2. Instead of using Application.Run(Form), use Application.Run(ApplicationContext). You will need to create a new ApplicationContext and move your code there.

Solution 1 is easier.

空城之時有危險 2024-10-08 05:02:24

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

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

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

It sounds like MyCabApplication extends Application. The Run method starts a WinForm application by starting a message loop that handles window messages.

Because you are already showing UI, there is already a message loop running, so you cannot start another. To get your main form to show up, make a new instance of it and call Show():

var form = new MainForm();
form.Show();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文