コンソールアプリケーションからwinformアプリケーションを正しく閉じたいと思っています。だから私はこのような何かしてみてください:コンソールアプリケーションからwinformsアプリケーションを正しく閉じる方法
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);
}
をしかし、私は、フォーム上のXボタンをクリックしたとき、私はnull参照の例外を持っていると私はそれがスローされた場所を知りません。 これを正しく行うにはどうすればよいですか?
更新日: もっと明確にする。私のコンソールアプリケーションはユーザーコマンドを読み込んだ後、いくつかの処理データメソッドを実行します。ユーザーがUIを表示するコマンドを書く場合、私は新しいフォームを開き、コンストラクタを介してデータを渡したいと思います。これらのデータは変更されるので、このフォームビューは5秒ごとに更新されます。主な目的は、データ処理をフォームから独立させることです。しかし、そのフォームを閉じると、null参照例外がスローされます。キャンセルを使用すると、フォームが閉じているときにこのタスクを強制終了しようとしています。
私はこのような何か作る答えるために、次のとおりです。
var data = new Data(...)
var thread = new Thread(() =>
{
data.Execute();
});
thread.Start();
if (runUI)
{
var UI = new FormUI(data);
Application.Run(UI);
}
をしかし、私は、フォームを閉じたときに、それはまだ私にエラーを与えます。
あなたのUIフォームはメインスレッドで作成されていますが、別のスレッドでメッセージループを開始します。フォームとそのメッセージループの作成は、同じスレッド上になければなりません。 UIフォームが終了すると、Application.Runメッセージループも終了し、スレッドも終了します。キャンセルトークンが必要な理由がわかりません。あなたのメインスレッドが何をしているのかを教えていただければ、uiフォームが終了したときにそれを終了させる方法についてのいくつかの示唆を与えることができます。 – FloatingKiwi
コンソールアプリケーションはコンストラクタを介してこのフォームにデータを渡します。 5秒ごとにデータを更新し、表示します。 – TjDillashaw
単にスレッドを交換することをお勧めします。プログラムがあなたのデータスレッドを起動するとき。その後、メインプログラムスレッドでApplication.Run(UI)を呼び出します。データスレッドがバックグラウンドスレッドとして設定されている場合、uiが実行すると自動的に終了します。 – FloatingKiwi