Comment passer d'exception explicitement pour le thread principal en c#
Je suis familier avec le fait que l'exception levée dans un thread, normalement, ne pouvait pas être pris dans un autre thread.
Comment puis-je transférer l'erreur cependant pour le thread principal?
public static void Main()
{
new Thread (Go).Start();
}
static void Go()
{
try
{
//...
throw null; //The NullReferenceException will get caught below
//...
}
catch (Exception ex)
{
//Typically log the exception, and/or signal another thread
//that we've come unstuck
//...
}
}
OriginalL'auteur user829174 | 2012-01-08
Vous devez vous connecter pour publier un commentaire.
Si vous êtes en utilisant .NET 4 il ya de meilleures façons de le faire avec
Tasks
, mais si vous avez besoin d'utiliserThreads
...Si votre exemple est une application de console, votre Principale méthode de sortie, peut-être avant
Go
commence à s'exécuter. Donc votre "fil conducteur" peut ne pas exister lorsque l'exception est levée. Pour arrêter cela, vous avez besoin d'une synchronisation.Quelque chose comme cela devrait le faire:
Si c'est une INTERFACE d'application, les choses sont un peu plus facile. Vous aurez besoin de passer une référence à votre thread d'INTERFACE utilisateur dans le
Go
méthode afin qu'il sache où envoyer l'exception. La meilleure façon de le faire est de passer leSynchronizationContext
de le thread d'INTERFACE utilisateur.Quelque chose de ce genre:
OriginalL'auteur Nicholas Butler
Si C# 4.0 est disponible pour vous, alors vous pouvez utiliser un
Task
au lieu d'unThread
. Les exceptions non traitées dans leTask
sont automatiquement propagées à l'joindre le fil. Voir ici: http://msdn.microsoft.com/en-us/library/dd997415.aspx pour les exemples et les exceptions à cette règle.OriginalL'auteur Tudor
Vous pouvez vous abonner à général les exceptions non gérées au niveau application.
OriginalL'auteur Tormod
C'est vraiment un vieux thread mais j'ai une approche originale à cette question, je vais donc mettre ma solution ici.
Le principal objectif dans mon cas, le thread principal est interrompu par exception à ce moment que l'enfant fil s'est l'exception, au lieu de la surveillance ou de l'attente, comme proposé dans d'autres réponses.
Comme il a été dit dans d'autres threads, on peut pas le faire avec la manière traditionnelle, mais nous pouvons envoyer interruption de l'autre thread, le thread principal.
L'envoi d'interrompre le thread principal génère ThreadInterruptedException sur le thread principal. Afin de l'attraper dans le thread principal et la vérification de tous les drapeau levé par l'autre thread va faire les détails de l'exception transfert.
Voici un exemple minimal (vous pouvez le rompre pour les classes et de faire mieux la conception plus tard)
OriginalL'auteur Rami Yampolsky
Je suppose que votre soi-disant "fil conducteur" doit interroger ou attendre pour les exceptions. Cela peut être fait avec une file d'attente et un sémaphore.
Dans votre thread principal vous pouvez interroger ou d'attendre le sémaphore.
OriginalL'auteur Thomas Maierhofer