2011-02-24 77 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。如果它不好 - 就關閉窗口,因爲它是最後一個窗體,應用程序將停止。

相關問題