2016-07-20 22 views
1

Nehmen wir an, dass unter der Nummer WindowsFormsApplicationBase.OnCreateMainForm() ein Fehler aufgetreten ist, wie kann ich die Anwendung "sanft" beenden? Ich möchte gehen wie die Verwendung hatte die Schließen-Taste gedrückt, so denke ich, Environment.Exit() wird nicht gut passen, da es eine Anwendung sofort beendet und möglicherweise nicht zulassen, dass die Anwendung selbst aufräumen.Was ist der richtige Weg, um die Anwendung von WindowsFormsApplicationBase.OnCreateMainForm() zu beenden?

Mein Code sieht wie folgt aus:

public class MyApp : WindowsFormsApplicationBase 
    { 
     public MyApp() 
     { 
      this.IsSingleInstance = true; 
     } 

     protected override void OnCreateSplashScreen() 
     { 
      this.SplashScreen = new splashForm(); 
     } 

     protected override void OnCreateMainForm() 
     { 
      if(!do_something()) { 
      /* something got wrong, how do I exit application here? */ 
      } 

      this.MainForm = new Form1(arg); 
     } 

Und meine Main() Funktion:

[STAThread] 
     static void Main(string[] args) 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      new MyApp().Run(args); 
     } 
+0

zu vermeiden. Die Anwendung wurde noch nicht gestartet. Es wird nur noch initialisiert, der Aufruf von Application.Run() passiert später. So kann Application.Exit() nicht funktionieren. Sicher, Environment.Exit() wird die Arbeit einfach erledigen. –

+0

Environment.Exit() wird beendet, anstatt die Anwendung zu beenden? Wenn ja, denke ich, es ist der Weg zu gehen – Jack

Antwort

0

Verwenden Sie einfach return:

protected override void OnCreateMainForm() 
{ 
    if(!do_something()) 
    { 
     return; 
    } 

    // This won't be executed if '!do_something()' is true. 
    this.MainForm = new Form1(arg); 
} 

Dies wird den aktuellen Thread beenden, so dass die MainForm Eigenschaft wird nicht festgelegt.

+0

Dies ist nicht ordnungsgemäß vorhanden, eine NoStartupFormException wird ausgelöst. – axk

+0

Vielen Dank für die Aktualisierung @axk. –

2

Ich arbeitete um dieses herum, indem ich ein leeres Formular erstellte, das sich sofort in der Last Ereignisbehandlungsroutine schließt. Dies ermöglicht es, die NoStartupFormException

public partial class SelfClosingForm : Form 
    { 
     public SelfClosingForm() 
     { 
      InitializeComponent(); 
     } 

     private void SelfClosingForm_Load(object sender, EventArgs e) 
     { 
      Close(); 
     } 
    } 

    protected override void OnCreateMainForm() 
    { 
     ... 

     if (error) 
     { 
      //this is need to avoid the app hard crashing with NoStartupFormException 
      this.MainForm = new SelfClosingForm(); 
      return; 
     }    
     ...