2

私の C# プログラムには、実行中のテストを表すスレッドがあります。このスレッドは、「実行の中断」というラベルの付いたボタンをクリックすることで中止できます。ThreadAbortedExceptionスレッド (したがってテスト) がエレガントな方法で終了する (そして事前にいくつかの重要な作業を行う) ために、このボタンは、明確に定義されたいくつかの瞬間にのみ有効になりますThread.ResetAbort()。 、 スレッド)。

問題は、アボートが可能な時間枠では、一度開始すると最初から最後まで実行する必要があるいくつかのタスクがあり、TAE が怖いことです。ロックはこれに対する解決策を提供しません。また、finally ブロックは解決策を提供しますが、次の方法で重要なコードをラップするのはエレガントではありません。

try {
} finally {
  // vital code
}

ただし、他の解決策は見つかりませんでした。

ThreadAbortExceptionこれはブロックの終わりまで干渉を遅らせる別の方法ですか?

4

2 に答える 2

4

ThreadAbortException が生成される状況は複雑な場合があります。より良いオプションは、ThreadAbortExceptions を使用している理由を尋ねることです。

より良いパターンは、単純にフラグを使用して実行中のスレッドにアボートする必要があることを示し、実行中にフラグを定期的にテストすることです。設定されている場合、必要に応じてその時点で例外をスローできます。

このパターンを使用すると、スレッドがアボートに対していつ動作するかを完全に制御でき、重要な操作が中断されることを心配する必要がありません。

于 2008-09-06T01:06:30.787 に答える
3

Thread.BeginCriticalRegion()を使用する

実行がコードの領域に入ろうとしていることをホストに通知します。この領域では、スレッドの中止または未処理の例外の影響により、アプリケーション ドメイン内の他のタスクが危険にさらされる可能性があります。

Thread.BeginCriticalRegion()

//do important stuff here

Thread.EndCriticalRegion()
于 2008-09-06T01:09:59.750 に答える