Application.Run在Application.Exit之后不工作在同一个线程上

时间:2012-10-11 03:28:49

标签: c# .net winforms message-pump

我的工作要求是首先显示一个启动画面,它从用户那里获取一些数据,验证他并启动另一个表单。 所以,我正在使用Application.Run启动启动屏幕,有一次,它已完成它,调用Application.Exit然后再次为新窗体调用Application.Run。但是,这并没有启动新形式。 我创建了一个新线程并将其ApartmentModel指定为STA以启动新表单。

我想了解为什么Application.Run在调用Application.Exit后无效?

示例代码:

        Application.Run(SplashForm);  

        if (_authorizationSuccessful)
            Application.Run(new Form2())
        else
        {
            //just close
        }

5 个答案:

答案 0 :(得分:3)

这是相当令人费解的,但核心问题是它实际上并不是一个使应用程序保持活跃状态​​的Form。核心助手类是ApplicationContext,也作为Application.Run()的重载之一公开。当您使用其他重载Run()和Run(Form)时,Application类会创建一个ApplicationContext的隐藏实例。与所有Application属性和方法一样,这是全局的。

因此,当您调用Application.Exit()时,将ApplicationContext的全局实例标记为“不再处于活动状态”。这使 next 调用Run(Form)立即退出。

您可以使用自己的ApplicationContext实例来解决此问题。但是样板解决方案是在登录表单上使用ShowDialog()方法。也是返回“登录好,让我们继续”状态的好方法,DialogResult很有用。

答案 1 :(得分:0)

首先,您需要以此形式显示主表单(在您的情况下为第二表单),您需要调用启动画面(身份验证),直到隐藏主时间表。在Splash Screen中,您需要使用this.Close()而不是Application.Exit()。关闭启动画面后,您需要显示主窗体。

答案 2 :(得分:0)

这样做

new SplashScreenForm().ShowDialog();//show splash screen and take user input
new MainForm().Show();//now show the main form
Application.Run();//starts the app

if (new SplashScreenForm().ShowDialog() == DialogResult.OK)//if its ok to start another form
{
    Application.Run(new MainForm());
}

  

Application.Run(Form)在当前线程上启动消息循环   显示指定的表单。消息循环启用表单   接收Windows消息(例如,按键,鼠标点击,绘画   失效),使其显得敏感并具有互动性   与用户

因此,当您执行Application.Exit()时,整个应用程序将关闭,而不是特定的表单

答案 3 :(得分:0)

为什么不这样做,而不是将所有东西都撕下来,为什么不这样做呢?

var f1 = new Form1();
f1.Show();
Application.Run();

其中Form1是启动画面。然后当它准备好显示主屏幕时,它可以这样做:

var f2 = new Form2();
f2.Show();
this.Close();

Form2是主屏幕。 (单个)消息循环始终在运行。

答案 4 :(得分:0)

当您想要退出应用程序时,向主方法抛出异常,捕获异常并根据需要退出应用程序。

假设,

try
{
    // your code here
}
catch
{
    // Some exception occurred here, and you want to exit here...
    throw;
}

在主程序中捕获异常,主程序代码为:

try
{
    Application.Run(new Form1());// <-- This is where you want to run your app
}
catch // <-- Catch here the exception where you want to exit your app
{
    Application.Exit(); //<-- exit app here.
}