6

WinFormsで使用するもの:

  • System.Windows.Forms.Application.ThreadException
  • System.Windows.Application.UnhandledException

Winforms以外のマルチスレッドアプリケーションには何を使用すればよいですか?

以下のC#.NET4.0の完全なコードを検討してください。

using System;
using System.Threading.Tasks;

namespace ExceptionFun
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            Task.Factory.StartNew(() =>
                {
                    throw new Exception("Oops, someone forgot to add a try/catch block");
                });
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            //never executed
            Console.WriteLine("Logging fatal error");
        }
    }
}

私はstackoverflowについて同様の質問をたくさん見ましたが、満足のいく答えが含まれているものはありませんでした。ほとんどの回答は、「コードに適切な例外処理を含める必要があります」または「AppDomain.CurrentDomain.UnhandledExceptionを使用する」というタイプです。

編集:私の質問は誤解されていたようですので、それを再定式化し、より小さなコード例を提供しました。

4

1 に答える 1

0

同等のものは必要ありません。CurrentDomain.UnhandledExceptionイベントは、マルチスレッド コンソール アプリケーションで問題なく動作します。しかし、スレッドの開始方法が原因で、あなたのケースでは発火していません。質問のハンドラーは、Windows アプリケーションとコンソール アプリケーションの両方で実行されません。しかし、次のようにスレッドを開始した場合 (たとえば):

new Thread(() => { 
     throw new Exception("Oops, someone forgot to add a try/catch block"); 
}).Start();

発火します。

この問題はTask.Factory.StartNew(...)CurrentDomain.UnhandledExceptionSO に関する多くの投稿で議論されています。ここでいくつかの提案を確認してください:

Task Parallel Library を使用しているときに未処理の例外をすべて処理するにはどうすればよいですか?

タスクで例外をキャッチする最良の方法は何ですか?

于 2015-01-18T14:25:28.443 に答える