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