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. 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.
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
Konsolenanwendung Übergeben Sie Daten über Konstruktor an dieses Formular. Forme nur die Daten alle 5 Sekunden auf und zeigt sie an. – TjDillashaw
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