WinFormフォームクローズプログラム終了実装


WinFormプログラム終了方法テクニック1.this.Close(); 現在のウィンドウを閉じるだけで、メインフォームでなければプログラムを終了することはできません.また、管理スレッド(非メインスレッド)があれば、きれいに終了することはできません.
2.Application.Exit(); すべてのメッセージを強制的に中止し、すべてのフォームを終了しますが、管理スレッド(非プライマリスレッド)がある場合は、きれいに終了できません.
3.Application.ExitThread(); 呼び出しスレッド上のすべてのメッセージを強制的に中止し、他のスレッドが正しく終了できないという問題に直面します.
4.System.Environment.Exit(0); これは最も徹底的な脱退方式であり,どんなスレッドでも強制的に脱退され,プログラムをきれいに終了させる.強く推薦する
注意:アプリケーションExit(); メソッドは、すべてのスレッドで実行されるすべてのメッセージループを停止し、アプリケーションのすべてのウィンドウを閉じます.Application.ExitはWin 32のPostQuitMessage()のように強引に脱退する方法です.これは、すべてのメッセージポンプを放棄し、呼び出しスタックを展開し、実行をシステムに返すことを意味します.
例:サブフォームを開いて操作を行う場合、ワードフォームにループ操作がある場合.実行中にサブフォームを閉じると、フォームは閉じられていますが、サブフォームのループプログラムは終了せずに実行され、ループが終了するまでシステムリソースを占有しています.ワードフォームのClosedイベントには次のコードが書かれていますが、
private void frmFileDisposal_Closed(object sender, System.EventArgs e){
         this.Dispose();
         this.Close();
}

なぜなら、Dispose()メソッドは、現在のフォームのリソースを解放できますが、ループを強制的に終了することはできません.現在のプログラムを強制的に強調するには:System.Environment.Exit(int exitcode)メソッド;このメソッド:現在のプロセスを終了し、ベースオペレーティングシステムに指定した終了コードを提供します.次のコードがあります.
private void frmFileDisposal_Closed(object sender, System.EventArgs e)
{         
 System.Environment.Exit(System.Environment.ExitCode);   
 this.Dispose();
 this.Close();
}


またはイベントに配置します.
while (MessageBox.Show("      ?", "", MessageBoxButtons.YesNo) 
   ==   DialogResult.No)
...{
   for(int j=1; j<=i; j++) 
  ...{
      listBox1.Items.Add(j);
   }   
}
System.Environment.Exit(System.Environment.ExitCode);


次のような方法もあります.
System.Threading.Thread.CurrentThread.Abort();
Process.GetCurrentProcess().Kill();
Application.ExitThread();
//      ,             ,        。          。


まとめ:最も良い方法は、サブフォームのClosingイベントで、書き込みループの終了条件を書くことです.これにより、未知のエラーを回避し、サブフォームのみを閉じ、サブフォームが使用するリソースを解放することができます.
記事の転載:https://blog.csdn.net/qq_33204100/article/details/83144271学習レコードの使用