質問

私はこのように初期化取得スレッドがあります:

Utility.Log("1");

myThread = new Thread(new ThreadStart(delegate
{
    Utility.Log("2");
その後、

とスレッドの実行の残りの部分。奇妙なことは、のtry / catchに包まれている全体のことにもかかわらず、私は私のログファイル(NO 2)で1を見ているされて、私は未処理のSystem.IO.FileLoadExceptionを取得しています。私はまたのtry / catchでデリゲートの体全体を包む試してみたが、私はまだその例外を取得していますし、イベントビューアには、例外の一番上の方法は、その方法であると言っています。それは非常に奇妙です。

私はこのダウンを追跡することができ、あるいは少なくとも適切に例外をキャッチする方法の任意のアイデア?

役に立ちましたか?

解決

A FileLoadExceptionはかなり深刻な災難です。 JITコンパイラは、あなたのスレッドで実行するコードをコンパイルしようとしたときに発生します。それが発生したため、のコードが実行を開始する前のtry / catchのペアは、<全角>この例外をキャッチすることはできません。言い換えれば、それは爆弾のあなたは、tryブロックに入る前に。これはスレッドであることを考えると、あなたがデスクトップにクラッシュからプログラムを停止することはできません。あなたが持っている最後のあえぎはAppDomain.UnhandledException、e.ExceptionObjectのInnerExceptionプロパティは本当に間違って何が起こっているかを説明します。

この例外は、そうでない場合は、常に簡単に修正可能でなければなりません。これは、JITコンパイラが間違ったバージョン番号を持っているか、アセンブリの古いバージョンの、そのようなものであるアセンブリを見つけ、設定の問題です。あなたはAppDomain.UnhandledExceptionからそれを診断することができない場合は、Fuslogvw.exeではツールは、間違ったアセンブリを見つける方法をお見せすることができます。 Aは、完全なソリューションの再構築を途中で修正になるはず。

他のヒント

あなただけのため、それはあなたの質問に答えることは非常に不可能だ、あなたのコードの一部を投稿しました。そこでここでは一般的なアドバイスです。

スレッドの匿名メソッドを使用しないでください。それはあなたのアプリケーション全体のダウンをもたらすことができる何かが間違っていると、スレッドでキャッチされない例外を行うことは非常に簡単です。

public void MyMethod()
{
    _myThread = new Thread(WorkerThread);
    _myThread.Start();
}

public void WorkerThread(object state)
{
    try
    {
      Utility.Log("2");
    }
    catch (Exception e)
    {
       //log error
    }
}

try..catchは間違いなくだけで元のスレッドで、新しいスレッドで例外をキャッチしません。

あなたは子スレッドで何が起こっているか仕事をしたい場合は、

は、あなたはそれを独自の例外処理を与える必要があります。それはあなたが「私はtry/catchでデリゲートの体全体を包むも試してみた」ごとにこれを実行しようとしましたが、その変更されたコードは、その正しさを確認するために必要とされるであろうように聞こえます。

また、子スレッドにデバッグすることで、このダウンを絞り込むことができる必要があります。

あなたはスレッド例外イベントハンドラを追加する必要が

ただ、application.run前にハンドラを追加し、すべての未処理のスレッドの例外をキャッチすることができます。

MSDNからの出典ます:

[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]
public static void Main(string[] args)
{
    // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

    // Set the unhandled exception mode to force all Windows Forms errors to go through
    // our handler.
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException +=
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    // Runs the application.
    Application.Run(new ErrorHandlerForm());
}

http://msdn.microsoft。 COM / EN-US /ライブラリ/ system.windows.forms.application.threadexception.aspxする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top