Application.Exit() 対 Application.ExitThread() 対Environment.Exit()
-
19-09-2019 - |
質問
どれを使えばいいのか考え中です。WinForm アプリを閉じると、ダイアログ モードでフォームが起動します。このフォームは、DB をリモート DB と同期するバックグラウンド ワーカーを実行し、その進行状況を「スプラッシュ フォーム」に表示します。
私は次のような方法を持っています:
private void CloseMyApp()
{
SaveUserSettings();
splashForm = new SplashForm();
splashForm.ShowDialog();
Application.ExitThread();
//Application.Exit();
}
これはアプリを閉じるために呼び出すものです メニュー --> 終了 そしてその中で Form_FormClosing()
イベント。 Application.Exit()
次のエラーが発生します -->
コレクションが変更されました。列挙操作が実行されない可能性があります。
今それを読みました Environment.Exit()
これは残忍であり、おそらくアプリに何か問題があることを意味します (「 ここ).
Application.ExitThread()
動作しますが、動作しているように見えるだけである可能性があり、これまで使用したことがないため、通常いつ使用するのが適切であるかわかりません。
解決
残念ながら、問題はこれらのいずれかが原因ではなく、これらすべてのシナリオで (メッセージが表示されない場合でも) 実際に存在します。
あなたの問題は次のとおりです。
WinForm アプリを閉じると、ダイアログ モードでフォームが起動します。このフォームは、DB をリモート DB と同期するバックグラウンド ワーカーを実行し、その進行状況を「スプラッシュ フォーム」に表示します。
シャットダウンを要求しても実際にはシャットダウンしていないため、すべての「終了」関数はバックグラウンド スレッドを破棄しようとします。残念ながら、これは DB 同期の途中で発生している可能性があり、保存ロジックで動作している列挙によってエラーが発生している可能性があります。
これらのいずれも使用しないことをお勧めします。ただ電話してください。 myMainForm.Close()
その代わり。これによりメイン フォームが閉じられ、終了ロジックが適切に起動されます。アプリケーションのメイン フォームが閉じると、正常にシャットダウンされます。
他のヒント
Environment.Exit()
コンソール アプリに使用されます。
使用したいもの: System.Windows.Forms.Application.Exit()
スレッドを終了すると、開始されたフォアグラウンド スレッドは実行されたままになり、現在のスレッド コンテキストが終了するだけになります。エラーの原因となっているスレッドがまだ実行されているのではないかと思われます。そのため、本質的に問題を回避するのではなく、問題を隠していることになります。なぜこのエラーが発生するのかを調べてみたいと思います "Collection was modified; enumeration operation may not execute."
出口で。それが暴露されているのは、 Application.Exit()
, しかしそれが原因ではありません。