12

IsBackground プロパティを true に設定した C# のスレッドを使用しています。アプリケーションが閉じるまで、スレッドはループ内でいくつかのコードを実行しています。アプリケーションが閉じられると、スレッドも実行を停止します (IsBackground = true を設定したため)。

アプリケーションはどのようにスレッドを強制終了しますか? ThreadAbortException が出ないので、abort を呼んでやっていないようです。舞台裏で起こっていますか?ループの最終ブロックでロールバックを行いたいと思います。

自分でスレッドで中止を呼び出すことができることはわかっていますが、アプリケーションがバックグラウンド スレッドを閉じる方法と、スレッド内から応答できるかどうかを知りたいです。Application.ApplicationExit イベントをサブスクライブできることはわかっていますが、サービスと winform の両方でこのコードを実行していて、ループ内で例外をキャッチしたいので、finally ステートメントでロールバックできます。

4

2 に答える 2

5

ThreadAbortExceptionが発生しないため、abortを呼び出しても実行されないようです。

そうです、CLRにはスレッドを中止する2つの方法があります。Thread.Abort()を介して呼び出される「通常の」方法では、スレッドはThreadAbortExceptionを確認できます。しかし、失礼な中絶もあり、同じように機能します。ただし、TAEを差し引くと、最終的にブロックは実行されません。あなたはそれを観察することはできません。

于 2012-06-13T08:16:42.763 に答える
1

オペレーティングシステムがプロセッサをに割り当てると、 Startedthreadは実行状態になります(つまり、実行を開始します)thread。開始スレッドが初めてプロセッサを受け取り、実行中のスレッドになると、スレッドはそのプロセッサを実行しますThreadStart delegate。これは、スレッドがライフサイクル中に実行するアクションを指定します。プログラムが新しいスレッドを作成するとき、プログラムはThreadStart delegateスレッドコンストラクターへの引数としてスレッドを指定します。

実行中のスレッドは、終了Stopped (or Dead)時に状態になりThreadStart delegateます。あなたの場合、メインスレッドは終了します。したがって、ThreadStart delegateオブジェクトはメモリに残りません。スレッドオブジェクトへの参照がない場合、ガベージコレクタはスレッドオブジェクトをメモリから削除できます。

于 2012-06-13T08:01:50.120 に答える