8

ASP.NET アプリケーションは、リクエスト以外のバックグラウンド スレッドで (バグが原因で) 発生している未処理の例外をどのように処理することになっていますか?

デフォルトでは、このような例外によりプロセスが終了します。ASP.NET ワーカー プロセスの設定では、同時実行中の要求が予期せず中止されるため、これは受け入れられません。これはパフォーマンスの問題でもあります。

要求スレッドでの例外は、ASP.NET が (エラー ページを表示して) 処理するため、問題になりません。

このAppDomain.UnhandledExceptionイベントにより、例外が発生したことを確認できますが、その時点で終了を防ぐことはできません。

これは、ASPX ページの分離コードに貼り付ける必要がある再現です。

protected void Page_Load(object sender, EventArgs e)
{
    var thread = new Thread(() =>
        {
            throw new InvalidOperationException("some failure on a helper thread");
        });
    thread.Start();
    thread.Join();
}

私が知っている唯一の解決策は、例外を未処理のまま「エスケープ」させないことです。これに対する、よりグローバルで徹底的なソリューションは他にありますか?

4

3 に答える 3

1

Rx(Reactive Programming)はこのような問題を解決するために生まれました.現在使用しているフレームワークを変更してRxに置き換えることを検討してみてください.

http://msdn.microsoft.com/en-us/data/gg577609.aspx

ナゲットのパッケージ:

https://nuget.org/packages/Rx-Main/1.0.11226

これは同等の Rx コードです。

        var o = Observable.Start(() => { throw new NotImplementedException(); });

        o.Subscribe(
            onNext => { },
            onError => { },
            () => { Console.WriteLine("Operation done"); });

ご覧のとおり、エラーのハンドラーを指定すると、エラーはバックグラウンド スレッドをエスケープしません。onError => { }

エラー ハンドラを指定しない場合、例外が伝播されます。

        o.Subscribe(
            onNext => { },
            () => { Console.WriteLine("Operation done"); });

上記の例では、例外が伝播され、投稿されたコードと同じ問題が発生します

于 2012-06-20T10:17:11.477 に答える
0

未処理の例外ハンドラーで例外を処理済みとしてマークできます。 https://msdn.microsoft.com/en-us/library/system.windows.applicationunhandledexceptioneventargs.handled(v=vs.95)

これにより、バックグラウンド スレッドでエラーが発生したため、ワーカー プロセスがリサイクルされなくなります。

ただし、すべての例外に対してそうするわけではありません。あなたが知っているものだけが無視しても安全です。

于 2015-07-01T19:35:45.693 に答える