So übergeben Sie die Ausnahme explizit an den Hauptthread in c #

8

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%     
user829174 08.01.2012, 10:43
quelle

5 Antworten

6

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%     
Nicholas Butler 08.01.2012, 11:34
quelle
7

Wenn C # 4.0 für Sie verfügbar ist, können Sie Task anstelle von Thread verwenden. Nicht abgefangene Ausnahmen in Task werden automatisch an den verbindenden Thread weitergegeben. Siehe hier: Ссылка für Beispiele und Ausnahmen zu dieser Regel.

    
Tudor 08.01.2012 10:48
quelle
2

Sie können allgemeine nicht behandelte Ausnahmen auf App-Ebene abonnieren.

    
Tormod 08.01.2012 11:50
quelle
2

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%     
Rami Yampolsky 29.08.2016 14:01
quelle
0

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.

    
Thomas Maierhofer 08.01.2012 10:52
quelle

Tags und Links