我正在为启动时运行的c#使用启动画面并检查应用程序许可证。
我从主窗体中显示这样的启动:
public partial class Form1 : Form
{
static bool stopThreads = false;
static bool gridChanged = false;
public Form1()
{
InitializeComponent();
Thread th = new Thread(new ThreadStart(DoSplash));
th.Start();
th.Join();
}
private void DoSplash()
{
Splash sp = new Splash();
sp.ShowDialog();
}
现在从启动窗体我尝试在许可证无效时退出应用程序,但它只退出启动并进入主窗体。
我尝试退出:
Enviroment.Exit();
Application.Exit();
Form1 f = new Form1();
this.Close();
但是没有一个关闭主要形式,只有关闭。
如何从启动表格类关闭整个应用程序?
答案 0 :(得分:2)
答案 1 :(得分:1)
是的,这些调用只会导致线程退出。您创建了一个新线程。在这种情况下,没有必要对它进行慷慨,Environment.Exit(1)将完成工作。 huff-and-puff版本是Control.BeginInvoke()以在主UI线程上运行代码。您需要对Form1的引用才能进行该调用。
Btw,你也会遇到SystemEvents的一个大问题,它们运行在错误的线程上,因为你创建的第一个窗口是在主UI线程以外的线程上创建的。当您锁定和解锁工作站时,最典型的事故是死锁。您需要等到UI线程上至少创建一个窗口。 Form1的OnLoad()方法覆盖或Load事件将是启动启动的好地方。或者只使用built-in support进行初始屏幕。答案 2 :(得分:0)
您可以使用Application.Exit()
或Environment.Exit()
。
这些可能不是关闭你的应用程序的“最干净”的方式,但如果你只是在启动屏幕上b,它不太可能导致任何问题。
编辑:如果要在没有显示启动画面的情况下退出 ,如果许可证无效,则应在显示启动画面之前检查许可证,然后在此之前退出。
答案 3 :(得分:0)
除非绝对必要,否则不要在应用程序中引入多线程。
正如沃尔特爵士所说,
否则,你将进入痛苦的世界。
此外,任何UI交互(例如显示窗口或使用控件)都必须仅在主线程上完成。
如果您想在屏幕上显示表单时执行某些操作,请调用Show
而不是模态ShowDialog
,这样就不会阻止执行。
Application.Exit ()
如果你在主线程上调用它,那么就会很好。
如果您希望在显示主表单之前显示启动画面,则不应在主表单的InitializeComponent
中执行此操作。相反,请更改Program.cs
中的代码以首先显示启动屏幕:
Application.Run (new SplashScreenForm ());
SplashScreenForm
中的某个地方(我不知道为什么你需要它,老实说)你应该检查许可证,如果没关系,关闭窗口,创建MainForm
实例并调用它ShowDialog
。如果它很糟糕 - 只需关闭窗口,因为它是最后一个窗体,应用程序就会停止。