Senden Sie eine Ausnahme von Faden zu Faden?
Möchte ich weitergeben eine Ausnahme von aktuellen thread (dieser thread ist nicht Haupt-thread), um den Haupt-thread.
Warum? Weil ich meine hard lock in einem anderen thread (dieser thread verwenden timer für die Kontrolle), und wenn HardLock
ist nicht zugänglich oder ungültig ist, ich eine Ausnahme erstellen, die definiert ist durch mich, und dann werfen die Ausnahme.
So, dass die Ausnahme nicht gut funktioniert. ;(
- Ich kann verwenden
public static method
im Programm.cs und rufen Sie es aus einem anderen thread(cuz das ist statische Klasse), und beenden Sie die Anwendung mitapplication.exit
aber das ist nur gut für die Kündigung appNOT
dabei anderen act!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre beste Wette ist, ersetzen Sie die
Thread
mit einemTask
(neu in .NET 4.0). DieTask
Klasse behandelt ordnungsgemäße Marshalling der Ausnahme was auch immer thread überprüft das Ergebnis der Aufgabe.Wenn mit .NET 4.0 ist nicht möglich, dann CoreEx.dll aus der Rx extensions umfasst eine
Exception.PrepareForRethrow
Erweiterung Methode bewahrt den call-stack für Ausnahmen. Sie können diese verwenden, in Verbindung mit MaLio ' s VorschlagSynchronizationContext
Marschall eine Ausnahme zu einem anderen thread.Können Sie die exception als parameter in event.
Und behandeln Sie nach dem senden die Ausnahme anderen thread.
Code-Beispiel.
Wissen, nichts anderes, wie es scheint, Ihre Arretierung ist gebrochen, wenn Sie einen thread, um sicherzustellen, dass Ihre locken sind nicht zu lange gehalten oder ungültig sind.
Wenn Sie wirklich brauchen, um Ausnahmen zu deinem main-thread, eine Kommunikation Warteschlange aus, alle Ihre 'worker threads', um Ihren "master-thread", und wickeln Sie Ihre gesamte worker-threads in einem exception-handler, die nichts mehr anfügen Ausnahmen von der Warteschlange und dann tötet diesen thread. Ihre master-thread eine Umfrage der Warteschlange zu entdecken, Ausnahmen und starten threads, die gestorben sind, nach der Korrektur der Fehler.
Übergeben Sie eine Referenz auf den Kontext für die Ausführung der main-form, um den thread (über die Stellvertretung oder ein Feld). Dann rufen Sie eine Methode (entweder senden oder post) über die Synchronisierung Kontext aus deinem thread, der die Ausnahme ausgelöst. Der Ausführungskontext wird es verarbeitet durch den ui-thread.
Vielleicht finden Sie es einfacher zu halten die Ausnahmebehandlung in den thread und weiterleiten der exception und stack-trace-durch Rücksendung
MyException.ToString()
einen Rückruf. Wenn ich Ausnahmen aus einem anderen thread, alles, was ich Suche, ist in dieser Zeichenfolge.Just my 2 cents.
Ich denke, man kann mit Invoke, BeginInvoke auf dem Hauptformular, wenn Sie Windows-Formulare zum senden einer Ausnahme aus der try/catch-block. Oder Sie können einen Ereignishandler erstellen/Stellvertretung im Haupt-thread und senden Ausnahmen durch, dass der Haupt-thread, so dass die Methode im Haupt-thread verarbeiten kann. Um ehrlich zu sein habe nicht versucht, diese Lösungen aber diese sind meine ersten Ideen.
PS. Vielleicht die Erstellung einer WorkerQueue auf der Haupt-thread ist auch eine option. Es wird laufen wie eine backgroundWorker-und wenn es dann neue exception geschickt in it-Prozesse entsprechend... ich kann Ihnen an kleinen Beispielen auf, dass, wenn Sie interessiert sind.
Edit:
Verwendet werden:
In Ihrem Haupt-thread-Klasse:
In der Initialize () - oder wo auch immer dein main-thread gestartet:
Und senden eine Ausnahme verwenden:
Vorbei:
defaultJob
(oder bin ich etwas fehlt?), was ist es? Ein einfacher Ersatz fürThread.Sleep
ist die Verwendung der AutoResetEvent (funktioniert sogar auf Windows Mobile). Erstellen Sie eine neueAutoResetEvent
ist, machen Sie einewhile (pendingJobs.Count > 0) { job = pendingJobs.Dequeue(); }
im Fall, dass ein neuer job wird in die Warteschlange eingereiht, während dequeueing, in Ihrem anderen, während Sie und legte eineresetEvent.WaitOne
statt Thread.Schlafen. InEnqueue
könnten Sie tun, einresetEvent.Set()
zu wecken die man inRun()
.