Ausnahmebehandlung in Threads

8

Vor kurzem habe ich ein Interview besucht. Ein Code-Snippet wird mir gegeben. Ich weiß, der Interviewer hat es aus Albharis Threading-Probe genommen.

%Vor%

Die Änderung des obigen Codes als

%Vor%

wäre der gute Kandidat, um die Ausnahme zu behandeln.

Ich wurde gefragt: "Mit Ausnahme der oben genannten Spur, welche anderen Alternativen würden als gute Lösung passen?. Es war schwer, die Alternative zu finden, also hebe ich es hier auf, um Ihren Vorschlag zu sammeln.

    
user184805 12.10.2009, 12:04
quelle

5 Antworten

15

Ausnahme, die in einem Thread ausgelöst wurde, konnte normalerweise nicht in einem anderen Thread gefunden werden.

Sie sollten es besser in der Funktion Go abfangen und explizit an den Hauptthread übergeben.

Wenn Sie jedoch nur alle unbehandelten Nachrichten von allen Threads protokollieren möchten, können Sie Ereignis AppDomain.UnhandledException oder entsprechende Ereignisse in der Application-Klasse, wenn Sie WinForms oder WPF-App entwickeln.

    
elder_george 12.10.2009, 12:11
quelle
3
  

Welche anderen Alternativen würden als gute Lösung passen ?.

Lösung für was? Welches Problem versuchen Sie zu lösen?

Wenn Sie BackgroundWorker verwenden, hat es im Gegensatz zu Thread eine RunWorkerCompleted Event, und innerhalb dessen können Sie das RunWorkerCompletedEventArgs Parameter für die Error-Eigenschaft. Dies wird normalerweise in WinForms- oder WPF-Anwendungen verwendet, da BackgroundWorker im Visual Studio-Designer gut unterstützt wird.

Sie können auch einen Delegaten für Go () definieren und damit BeginInvoke () aufrufen. Natürlich brauchst du auch die EndInvoke ().

Außerdem ist es im Allgemeinen keine gute Idee, zufällige Threads zu starten. ThreadPool.QueueUserWorkItem, BackgroundWorker oder asynch delegates verwenden den ThreadPool und werden empfohlen.

    
Cheeso 12.10.2009 12:12
quelle
1

Sie können das AppDomain.UnhandledException -Ereignis

verwenden     
Thomas Levesque 12.10.2009 12:12
quelle
0

Es gibt Alternativen auf der Website von Joe Albahari: Ссылка

"Es gibt jedoch einige Fälle, in denen Sie Ausnahmen in einem Arbeitsthread nicht behandeln müssen, da das .NET Framework dies für Sie erledigt. Diese werden in den folgenden Abschnitten behandelt und sind:
  -Asynchrone Delegaten
  -BackgroundWorkers
  -Die Task Parallel Library (Bedingungen gelten) "

    
jrupe 27.03.2014 20:47
quelle
0

Ich denke, das ist der einfachste Weg ist:

%Vor%

Es gibt jedoch einen anderen Weg, den manche bevorzugen könnten, wenn Sie den Thread synchronisieren wollen (vielleicht ist das ein anderer Thread als der GUI-Thread):

%Vor%

Beachten Sie, dass das zweite Beispiel mehr Sinn macht, wenn Sie mehrere Threads haben und diese durchlaufen und alle verbinden ... aber ich behalte das Beispiel einfach.

Das dritte Muster würde Task Factory verwenden, das sauberer ist:

%Vor%     
max 12.01.2015 00:56
quelle

Tags und Links