Ich bin mit der Tatsache vertraut, dass in einem Thread geworfene Ausnahme normalerweise nicht in einem anderen Thread gefangen werden kann. Wie kann ich den Fehler jedoch auf den Hauptthread übertragen?
%Vor% Wenn Sie .NET 4 verwenden, gibt es bessere Möglichkeiten, dies mit Tasks
zu tun, aber vorausgesetzt, Sie müssen Threads
... verwenden
Wenn Ihr Beispiel eine Konsolenanwendung ist, wird Ihre Main-Methode beendet, möglicherweise bevor Go
die Ausführung startet. Ihr "main thread" existiert möglicherweise nicht, wenn die Ausnahme ausgelöst wird. Um dies zu stoppen, benötigen Sie eine Synchronisierung.
So etwas sollte tun:
%Vor% Wenn dies eine UI-App ist, sind die Dinge ein bisschen einfacher. Sie müssen einen Verweis auf Ihren Benutzeroberflächenthread an die Methode Go
übergeben, damit er weiß, wohin die Ausnahme gesendet werden soll. Der beste Weg, dies zu tun, ist, die SynchronizationContext
des UI-Threads zu übergeben.
So etwas würde funktionieren:
%Vor%Sie können allgemeine nicht behandelte Ausnahmen auf App-Ebene abonnieren.
Dies ist ein wirklich alter Thread, aber ich habe eine originelle Herangehensweise an dieses Problem, deshalb werde ich hier meine Lösung vorschlagen.
Das Hauptziel in meinem Fall war, dass der Hauptthread in dem Moment durch Ausnahme unterbrochen wird, in dem der untergeordnete Thread die Ausnahme erhielt, anstatt zu überwachen oder zu warten, wie in anderen Antworten vorgeschlagen. Wie in anderen Threads gesagt wurde, können wir das nicht mit herkömmlichen Methoden tun, aber wir können Interrupts vom anderen Thread zum Hauptthread senden.
Das Senden von Interrupt an den Hauptthread generiert ThreadInterruptedException für den Hauptthread. Wenn Sie es also im Hauptthread abfangen und jedes Flag überprüfen, das vom anderen Thread ausgelöst wird, werden die Ausnahmedetails ebenfalls übertragen.
Hier ist ein minimales Beispiel (Sie können es in Klassen aufteilen und später besser entwerfen)
%Vor%Ich nehme an, dass Ihr sogenannter "Haupt-Thread" abfragen oder auf Ausnahmen warten sollte. Dies kann mit einer Warteschlange und einem Semaphor erfolgen.
%Vor%In Ihrem Haupt-Thread können Sie abfragen oder auf den Semaphor warten.
Tags und Links c# multithreading