.NET-Ausnahmen zwischen Threads weitergeben

Bei der Weitergabe von Exceptions aus einem Hintergrund-Thread (z.B. innerhalb einer BackgroundWorker-Instanz) an den Haupt-Vordergrund-Thread gilt es zu beachten, dass immer nur die zuerst generierte Ausnahme weitergegeben wird.

D.h. selbst wenn Ihr im Hintergrund-Thread die Ausnahme abfangt und eine neue Exception werft (z.B. mit der Original-Exception als InnerException), so wir an den Vordergrund-Thread trotzdem nur die erste Ausnahme weitergegeben.

Ursache

Der Benutzer „nobugz“ (das ist übrigens der hier) beschreibt das in einer Diskussion auf MSDN so:

This is an architectural limitation to the way exceptions are marshalled from one thread (the BGW’s) to another (the UI thread). Only a single exception object can get copied, the designers chose the first one thrown as the most likely to be relevant. You’ll need to work around this restriction.

Interessanterweise tritt der Verhalten nur in einem Application.ThreadException-Ereignis-Handler auf. (Ggf. wird TLS verwendet?)

Lösung

Eine mögliche Lösung im Falle des BackgroundWorkers ist es, die Exceptions direkt im RunWorkerCompleted-Handler zu behandeln (an den es automatisch übergeben wird), und eben nicht selbst eine Exception im Hintergrund-Thread zu werfen und darauf zu hoffen, dass der Application.ThreadException-Ereignis-Handler diese behandelt.

Zusammenfassung

Aus meiner Sicht verhält sich hier das .NET-Framework falsch. Ändern kann ich’s nicht; ggf. hilft Euch mein kleiner Tipp. Gerne lasse ich mich auch eines besseren belehren.