2011-02-24 79 views
0

我为启动时运行的c#使用启动画面并检查应用程序许可证。从启动画面退出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(); 

但没有关闭的主要形式,只有飞溅。

如何从splash表单类关闭整个应用程序?

+4

你为什么要在另一个线程中启动你的splash?尝试从主线程启动它,并执行一个Application.Exit() – xanatos 2011-02-24 21:03:11

+0

感谢工作,但我怎样才能防止主窗体出现几毫秒前退出? – heresma 2011-02-24 21:09:48

+0

尝试在初始化组件之前将您的启动和应用程序退出。 – Spidy 2011-02-24 21:20:04

回答

1

是的,这些调用只会导致线程退出。您创建了一个新线程。在这种情况下没什么好说的,Environment.Exit(1)将完成工作。 Huff-and-Puff版本是Control.BeginInvoke()以在主UI线程上运行代码。您需要对Form1的引用才能进行该调用。

顺便说一句,你也会遇到SystemEvents的一个大问题,它们运行在错误的线程上,因为你创建的第一个窗口是在除主UI线程之外的线程上创建的。当您锁定和解锁工作站时,最典型的事故是死锁。您需要等待至少一个窗口在UI线程上创建。 Form1的OnLoad()方法覆盖或Load事件将是一个开始启动的好地方。或者使用built-in support作为启动画面。

0

你可以使用Application.Exit()Environment.Exit()

这些可能不是关闭应用程序的“最干净”的方式,但如果您只是在启动屏幕上进行保护,则不太可能会导致任何问题。

编辑:如果您想要退出而不显示启动画面如果许可证无效,则应在所有之前退出,您应该在显示启动画面之前检查许可证,并在此之前退出。

0

除非绝对必要,否则不要在应用程序中引入多线程。
正如沃尔特爵士所言,

否则,你要进入一个痛苦的世界。

此外,任何UI交互(例如显示窗口或使用控件)必须仅在主线程上完成。

如果您想要在屏幕上显示表单时执行某些操作,请拨打Show而不是模式ShowDialog,以免执行不被阻止。

Application.Exit() 

如果你在主线程上调用它,你应该做的很好。

如果你想显示启动画面显示主要形式之前,你不应该这样做在主要形式InitializeComponent。相反,在Program.cs改变代码来显示启动画面第一:

Application.Run (new SplashScreenForm()); 

某处SplashScreenForm(我不知道为什么你需要它在所有的,说实话),你应该检查是否有执照,如果它的罚款,关闭窗口,创建MainForm实例并将其称为ShowDialog。如果它不好 - 就关闭窗口,因为它是最后一个窗体,应用程序将停止。

相关问题