Question

J'ai un fil qui se j'initialiser comme ceci:

Utility.Log("1");

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

et puis le reste de l'exécution du thread. La chose étrange est, en dépit de cette chose tout étant enveloppé dans un try / catch, je ne vois un 1 dans mon fichier journal (n ° 2), et je reçois un System.IO.FileLoadException non prise en charge. J'ai essayé aussi envelopper le corps du délégué dans un try / catch, mais je suis toujours obtenir cette exception, et l'Observateur d'événements dit que le plus haut sommet méthode de l'exception est cette méthode. Il est très bizarre.

Toutes les idées de la façon dont je peux suivre cette baisse, ou tout au moins pour attraper correctement l'exception?

Était-ce utile?

La solution

A FileLoadException est une mésaventure assez sérieux. Il est déclenché lorsque le compilateur JIT tente de compiler le code que vous exécutez dans votre fil. Un try / catch paire ne peut pas attraper cette exception parce qu'elle est élevée avant le code commence à exécuter. En d'autres termes, il bombes avant vous entrez dans le bloc try. Étant donné que c'est un fil, vous ne pouvez pas arrêter votre programme de se briser sur le bureau. Le dernier soubresaut vous est AppDomain.UnhandledException, la propriété InnerException du e.ExceptionObject vous indique ce qui se passe vraiment mal.

Cette exception devrait par ailleurs être facilement réparable toujours. Il est un problème de configuration, le compilateur JIT trouve un ensemble qui a le numéro de version est erronée ou une ancienne version de l'ensemble, quelque chose comme ça. Si vous ne pouvez pas diagnostiquer de AppDomain.UnhandledException alors l'outil Fuslogvw.exe peut vous montrer comment il est de trouver le mauvais montage. Une reconstruction complète de votre solution doit être à mi-chemin d'une solution.

Autres conseils

Vous avez seulement annonce une partie de votre code, donc il est impossible de répondre à votre question. Alors, voici un conseil général.

Ne jamais utiliser des méthodes anonymes pour les discussions. Il est très facile de faire quelque chose de mal et exceptions non interceptées dans les discussions peuvent apporter votre application entière vers le bas.

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

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

Le try..catch original ne sera pas attraper certainement des exceptions dans votre nouveau thread, seulement dans le fil d'origine.

Si vous voulez travailler ce qui se passe dans le fil de l'enfant, vous devrez lui donner sa propre gestion des exceptions. On dirait que vous avez essayé de le faire par « Je l'ai essayé aussi envelopper le corps du délégué dans un try/catch », mais que le code modifié serait nécessaire pour confirmer son exactitude.

Vous devez également être en mesure de réduire ce par le débogage dans le thread enfant.

Vous avez besoin d'ajouter un gestionnaire d'événements d'exception de fil:

Il suffit d'ajouter le gestionnaire avant application.run et vous pouvez attraper toutes les exceptions de fil non prise en charge.

Source de 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 / fr-fr / bibliothèque / system.windows.forms.application.threadexception.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top