プロセスが終了すると、OSは割り当てられたすべてのメモリを再利用し、開いているすべてのハンドルを閉じます。アプリケーションをシャットダウンするという非常に特別なイベントでリークするMEMORY*)について心配する必要はありません。OSは、少なくとも理論的には、開いているすべてのハンドルを閉じます**)。これらすべてを考慮に入れると、他の共有リソースを強制終了する前に、フォームデストラクタからスレッドを( TerminateThread(MyThread.Handle)を使用して)終了するだけで安全な場合があります。それらの質問を自問してください:
- スレッドは何をしていますか?いつでも終了しても安全ですか?例:スレッドがディスクへの書き込みを行っている場合、ディスク上のファイルが不整合な状態で存在する可能性があるため、スレッドを強制終了することは安全ではありません。
- Windowsによって自動的に解放されないリソースを使用していますか?ここで良い例を考えることはできません...
両方で安全を確保している場合は、TerminateThreadを使用して、スレッドが自然に終了するのを待つ必要はありません。より安全なアプローチは組み合わせたアプローチかもしれません。スレッドを自然に終了する機会を与え、5秒以内に終了しなかった場合は、強制的に終了する必要があります。
*)メモリについて話しているのは、プロセスの終了時にのみリークを証明できることです。たとえば、スレッドを適切にシャットダウンせずに強制終了したり、解放しないグローバルシングルトンクラスなどです。これはバグであるため、他のすべてのアカウントされていないメモリを追跡して修正する必要があります。
**)残念ながら、WindowsOSにはバグがありません。例:Windowsプラットフォームでシリアルデバイスを操作したことがある人なら誰でも、シリアルデバイスを「ロック」状態にするのがいかに簡単かを知っています。再び動作させるには再起動が必要です。技術的には、これはハンドルでもあり、ロックしたアプリケーションを最終処理すると、ロックが解除されます。