c# - thread - Ausnahmen in der Callback-Methode für Timer auslösen




c# thread invoke beispiel (2)

Ich konnte nirgends eine Antwort auf diese Frage finden ...

Was passiert mit den Ausnahmen, die in der Callback-Methode für System.Threading.Timer (oder im Ereignishandler für System.Timers.Timer) ausgelöst werden. Wird die Ausnahme an den Thread weitergegeben, für den der Timer erstellt wurde oder ist die Ausnahme verloren gegangen?

Welche Nebenwirkungen hat das Auslösen einer Ausnahme innerhalb der Callback-Funktionen des Timers?

Was wäre der richtige Weg, um dem Erstellungs-Thread des Timers zu signalisieren, dass die Ausnahme im Worker-Thread (Callback-Methode) ausgelöst wurde?

Vielen Dank für Ihre Zeit.


Ich weiß nicht, ob es eine beste Lösung ist, aber was ich getan habe, war ein kleiner Workaround. Mein aufrufender Thread hat ein Ereignis zum Abfangen von Ausnahmen aus allen Threads abonniert. Wenn also in einem Thread eine Exception auftritt, z. B. im TimerElapsed-Ereignis, dann fasse den catch-Block und hole das Exception-Objekt für die Ereignisübergabe als Argument für das Ereignis.

EventHolderCallingClass: Es muss Delegate und Event wie unten gezeigt definieren.

public class EventHolderCallingClass
{    
  public delegate void HandleExceptionEventDelegate(Exception exception);
  public event HandleExceptionEventDelegate HandleExceptionEvent ;

  void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  {
    try
    {
      //some operation which caused exception.
    }
    catch(Exception exception)
    {
      if(HandleExceptionEvent!=null)
        HandleExceptionEvent(exception) 
    }
  }
}

Event-Handler-Klasse (Ausnahme-Handler):

    public EventHandlerClassConstructor()
    {
            EventHolderCallingClass.HandleExceptionEvent += new EventHolderCallingClass.HandleExceptionEventDelegate(HandleExceptionEventHandler);            
    }

    void HandleExceptionEventHandler(Exception exception)
    {
        //handle exception here.
    }

Ich weiß nicht, was die beste Option ist, aber wenn ich einen Callback-Timer verwende, werfe ich normalerweise Ausnahmen und lasse sie zur Haupt-Callback-Routine übergehen, wo ich sie elegant behandle. Der Thread läuft weiterhin auf dem Timer wie es sollte.

Unbehandelte Ausnahmen im Thread (System.Threading.Timer) stoppen Ihr gesamtes Programm.





multithreading