Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序。在应用程序之后运行不工作。在同一线程上退出_C#_.net_Winforms_Message Pump - Fatal编程技术网

C# 应用程序。在应用程序之后运行不工作。在同一线程上退出

C# 应用程序。在应用程序之后运行不工作。在同一线程上退出,c#,.net,winforms,message-pump,C#,.net,Winforms,Message Pump,我工作中的需求是首先显示一个启动屏幕,它接收用户的一些数据,对用户进行身份验证,然后启动另一个表单。 所以,我用Application.Run启动启动启动屏幕,一旦完成,调用Application.Exit,然后调用Application.Run重新运行新表单。但是,这并不是新表单的开始。 我创建了一个新线程,并将其ApartmentModel分配为STA以启动新表单 我想了解为什么调用Application.Run后Application.Run不工作。退出 示例代码: App

我工作中的需求是首先显示一个启动屏幕,它接收用户的一些数据,对用户进行身份验证,然后启动另一个表单。 所以,我用Application.Run启动启动启动屏幕,一旦完成,调用Application.Exit,然后调用Application.Run重新运行新表单。但是,这并不是新表单的开始。 我创建了一个新线程,并将其ApartmentModel分配为STA以启动新表单

我想了解为什么调用Application.Run后Application.Run不工作。退出

示例代码:

        Application.Run(SplashForm);  

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

首先,您需要显示主窗体(本例中的第二个窗体),在此窗体中,您需要调用启动屏幕(身份验证),直到主窗体被隐藏为止。在启动屏幕中,您需要使用此.Close()而不是Application.Exit()。关闭启动屏幕后,您需要显示主窗体。

这样做

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());
}

注 Run(Form)在当前线程上启动一个消息循环,然后 显示指定的窗体。消息循环使表单能够 接收Windows消息(例如,按键、鼠标单击、绘制 失效),使其看起来响应迅速并具有交互作用 与用户


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

与其将所有内容都拆下来,只是为了重新构建它,为什么不这样做:

var f1 = new Form1();
f1.Show();
Application.Run();
其中
Form1
是启动屏幕。然后,当它准备好显示主屏幕时,它可以执行以下操作:

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

其中
Form2
是主屏幕。(单个)消息循环始终保持运行。

它相当复杂,但核心问题是它实际上不是一个保持应用程序活动的表单。核心助手类是ApplicationContext,它也是作为Application.Run()的重载之一公开的。当使用其他重载Run()和Run(Form)时,应用程序类将创建ApplicationContext的隐藏实例。它是全局的,就像所有的应用程序属性和方法一样

因此,当调用Application.Exit()时,将ApplicationContext的全局实例标记为“不再活动”。这使得下一次调用Run(Form)立即退出


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

在您要退出应用程序时,向main方法抛出异常,捕获异常并根据需要退出应用程序

假设

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.
}
试试看
{

Application.Run(new Form1());//您能发布有问题的代码吗?如果不了解您以编程方式获取错误的步骤,我们将无法帮助您解决此类问题。您可能需要
ExitThread()
而不是
应用程序。退出
?当您调用应用程序时。退出应用程序。下一行代码将永远不会执行,因为程序已经停止运行。Application.Exit不会关闭进程。它只会终止所有现有的消息循环并强制运行返回。为什么我不能调用另一个应用程序在它从第一个返回后运行?@user1736766 msdn一如既往地非常混乱。他们对此没有适当的文档。在我的情况下,只提供了一个公开入口点(即Main)的程序集。因此,我无法准确地执行“f2.Show()”。