未処理の例外処理に .NET 1.1 互換モードを使用しています。問題は、LegacyUnhandledExceptionPolicy が「1」に設定されている場合 (これが必要です)、ThreadAbortException をキャッチして飲み込めないことです。
コード例:
App.config:
<configuration>
<runtime>
<legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>
</configuration>
コード:
class Program {
static void Main(string[] args) {
AppDomain.CurrentDomain.UnhandledException += _onBackgroundThreadCrash;
var t = new Thread(_worker) { IsBackground = true };
t.Start();
Thread.Sleep(1000);
t.Abort();
Console.ReadLine();
}
private static void _worker() {
try {
while (true);
} catch (ThreadAbortException) {
// expected thread exit, don't rethrow
}
}
private static void _onBackgroundThreadCrash(object sender, UnhandledExceptionEventArgs e) {
Console.WriteLine(e.ExceptionObject as Exception);
}
}
従来の例外処理が "0" (OFF) の場合、上記のコードは予想どおり ThreadAbortException を静かに飲み込みます。
しかし、従来の例外処理が「1」の場合、上記のコードは ThreadAbortException をコンソールに出力しますが、これは私が期待するものではありません。
何か案は?
ありがとう。