Frage

Ich habe einen Thread, den ich so initialisieren erhalten:

Utility.Log("1");

myThread = new Thread(new ThreadStart(delegate
{
    Utility.Log("2");

und dann der Rest der Ausführung des Gewindes. Das Seltsame ist, obwohl das Ganze in einer try / catch eingewickelt werden, ich sehe nur ein 1 in meiner Protokolldatei (keine 2), und ich bin eine nicht behandelte System.IO.FileLoadException bekommen. Ich habe auch versucht, in einem try / catch den gesamten Körper des Delegierten Einwickeln, aber ich bin immer noch, dass die Ausnahme bekommen, und die Ereignisanzeige sagt, dass die oberste Methode der Ausnahme, dass Methode. Es ist sehr seltsam.

Irgendwelche Ideen, wie ich diesen nach unten verfolgen können, oder zumindest richtig die Ausnahme zu fangen?

War es hilfreich?

Lösung

Ein Fileloadexception ist eine ziemlich schwere Panne. Es wird ausgelöst, wenn die JIT-Compiler versucht, den Code zu kompilieren, dass Sie in Ihrem Thread ausgeführt. Ein try / catch-Paar kann diese Ausnahme nicht fangen, weil sie angehoben wird vor der Code beginnt mit der Ausführung. Mit anderen Worten, es Bomben vor geben Sie den Try-Block. Da dies ein Thread, können Sie Ihr Programm nicht stoppen auf den Desktop vor einem Absturz. Der letzte Atemzug Sie haben, ist AppDomain.UnhandledException, die e.ExceptionObject die Innerexception-Eigenschaft sagt Ihnen, was wirklich los ist falsch.

Diese Ausnahme sollte sonst immer leicht reparierbar sein. Es ist ein Konfigurationsproblem, finden die JIT-Compiler eine Baugruppe, die die falsche Versionsnummer hat oder eine alte Version der Assembly, so ähnlich. Wenn Sie es nicht aus AppDomain.UnhandledException diagnostizieren kann dann kann das Fuslogvw.exe Werkzeug, das Sie zeigen, wie es die falsche ist das Auffinden Montage. Eine vollständige Wiederherstellung Ihrer Lösung sollte auf halbem Weg zu einer Lösung sein.

Andere Tipps

Sie haben nur einen Teil des Codes veröffentlichen, deshalb ist es ganz unmöglich, Ihre Frage zu beantworten. Also hier ist eine allgemeine Beratung.

Verwenden Sie anonyme Methoden für Threads. Es ist sehr einfach, etwas falsch und nicht abgefangene Ausnahmen in Threads zu tun, um Ihre gesamte Anwendung nach unten bringen.

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

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

Die ursprüngliche try..catch nicht definitiv Ausnahmen in Ihrem neuen Thread fangen, nur im Ursprung Faden.

Wenn Sie herausfinden wollen, was in dem Kind Thread los ist, werden Sie es seine eigene Ausnahmebehandlung geben müssen. Es klingt wie Sie versucht, dies zu tun pro „Ich habe auch versucht, den ganzen Körper des Delegierten in einer try/catch Einwickeln“, aber das veränderte Code würde benötigt werden, um seine Richtigkeit zu bestätigen.

Sie sollten auch in der Lage sein, diese nach unten zu verengen, indem dem Debuggen in den untergeordneten Thread.

Sie müssen eine Thread Ausnahme Ereignishandler hinzu:

Fügen Sie einfach den Handler vor application.run und Sie können alle nicht behandelten Thread Ausnahmen fangen.

Quelle von 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 / library / system.windows.forms.application.threadexception.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top