2016-08-11 2 views
1

Ich möchte Winform-Anwendung ordnungsgemäß von der Konsole App zu schließen. Also versuche ich, etwas wie folgt aus:Wie Winforms-Anwendung ordnungsgemäß von der Konsolenanwendung zu schließen

   var cancelSource = new CancellationTokenSource(); 
       if (runUI) 
       { 
        var UI = new FormUI(somedata); 

        //cancel request if form is closing. 
        UI.FormClosing += (sender, args) => 
        { 
         cancelSource.Cancel(); 
        }; 


        Task.Factory.StartNew(() => 
        { 
         //run form from console app. 
          Application.Run(UI); 

        }, cancelSource.Token); 
       } 

Aber wenn ich X-Taste auf Formular geklickt habe ich NULL-Verweis Ausnahme, und ich weiß nicht, wo sie geworfen wurde. enter image description here Also, wie man es richtig macht?

UPDATE: Um klarer zu sein. Meine Konsolenanwendung liest nur Benutzerbefehle und führt dann einige Verarbeitungsdatenmethoden aus. Wenn der Benutzer einen Befehl zum Anzeigen der Benutzeroberfläche schreibt, möchte ich ein neues Formular öffnen und Daten über den Konstruktor übergeben. Diese Daten ändern sich, sodass ich diese Formularansicht alle 5 Sekunden aktualisiere. Hauptzweck ist es, die Datenverarbeitung unabhängig von der Form zu machen. Aber wenn ich dieses Formular schließe, wird die Nullreferenzausnahme ausgelöst. Die Verwendung der Stornierung versucht nur, diese Aufgabe zu beenden, wenn das Formular geschlossen wird.

Im Anschluss an ich beantworten machen etwas wie folgt aus:

  var data = new Data(...) 
      var thread = new Thread(() => 
      { 
       data.Execute(); 
      }); 
      thread.Start(); 

      if (runUI) 
      { 
       var UI = new FormUI(data); 
       Application.Run(UI); 
      } 

Aber es mich immer noch Fehler geben, wenn ich das Formular zu schließen.

+0

Ihr UI-Formular wird auf dem Hauptthread erstellt, aber Sie starten Ihre Nachrichtenschleife in einem anderen Thread. Die Erstellung eines Formulars und seiner Nachrichtenschleife sollte sich auf demselben Thread befinden. Wenn Ihr UI-Formular beendet wird, wird auch die Application.Run-Nachrichtenschleife beendet, sodass Ihr Thread ebenfalls beendet wird. Ich verstehe nicht, warum du das Kündigungszeichen brauchst. Wenn Sie uns mitteilen, was Ihr Hauptthread macht, können wir Ihnen einige Hinweise geben, wie Sie es beenden können, wenn das ui-Formular geschlossen wird. – FloatingKiwi

+0

Konsolenanwendung Übergeben Sie Daten über Konstruktor an dieses Formular. Forme nur die Daten alle 5 Sekunden auf und zeigt sie an. – TjDillashaw

+0

Ich würde empfehlen, dass Sie einfach die Threads tauschen. Wenn das Programm den Datenthread startet. Rufen Sie dann Application.Run (UI) im Hauptprogrammthread auf. Wenn der Datenthread als Hintergrundthread festgelegt ist, wird er automatisch beendet, wenn das ui ausgeführt wird. – FloatingKiwi

Antwort

0

Ich bin mir nicht sicher, was genau du mit der Abbruchlogik machen willst. Aber wenn du deine App mit dem Formular auf dem Hauptthread strukturierst, dann ist es ganz einfach.

Der _dataThread wird trotz des Formularabschlusses weiter ausgeführt.

_dataThread = new Thread(MyDataProcessingLoop) 
_dataThread.Start() 
if(runUI){ 
    _uiForm = new UIForm(); 
    Application.Run(_uiForm); 
}else{ 
    Application.Run(); //Keep the application running 
} 
+0

Ich habe den Beitrag aktualisiert, um klarer zu sein. Ich habe Ihre Lösung versucht, aber geben Sie mir immer noch null Referenz Ausnahme. – TjDillashaw

+1

Vergewissern Sie sich, dass Debug -> Exceptions -> Clr Exceptions -> Thrown aktiviert ist. Dies stoppt die Ausführung jedes Mal, wenn eine Ausnahme auftritt. Untersuchen Sie Ihre Stack-Spur. Es ist nicht das Schließen des Formulars, sondern das Formular, das entweder um das Exit geht, der Timer versucht, es nach dem Beenden zu ändern, die App versucht nach dem Schließen mit dem Formular zu interagieren. Außerdem sollten Sie eine Protokollierung in Ihre Anwendung implementieren, so dass Sie diese Vermutung nicht tun müssen. – FloatingKiwi

+0

Sie hatten Recht. Danke, dass Sie mich wissen lassen, wie Sie diese Ausnahme überprüfen können. Das Problem war, dass ich nach dem Schließen des Formulars versuchte, etwas zu bearbeiten, das nicht mehr existierte. – TjDillashaw

Verwandte Themen