2009-05-08 7 views
0

Ich habe Code mit einer System.Transactions.TransactionScope, dass das Erstellen einer neuen Instanz des Transaktionsbereichs einfach das Programm anhält.neues System.Transactions.TransactionScope() auf Hintergrund Thread stoppt Programm

Es gibt keine Ausnahmen oder Meldungen, das Programm stoppt einfach und Visual Studio kehrt zum Code-Bearbeitungsmodus zurück. Der Prozess ist komplett weg. In der Ereignisanzeige gibt es keine Ausnahmen, Meldungen oder Ereignisse.

Ich habe eine andere Test-App, die TransactionScope ohne Probleme verwendet, also sollte es kein Umweltproblem sein.

Ich weiß nur nicht, wie man das Ausnahmedetail bekommt. Ich habe alle "geworfenen" Checkboxen im Debugging-> Exceptions-Dialog in Visual Studio aktiviert, in der Hoffnung, dass VS automatisch bricht, wenn die Ausnahme ausgelöst wurde, aber es nicht tut.

Kann mir jemand helfen, den Grund für das Beenden des Programms zu bekommen?

EDIT: Ich habe gerade etwas neues gefunden. Das TransactionScope wird in einer Methode erstellt, die in einem Hintergrundthread über ThreadPool.QueueUserWorkItem ausgeführt wird. Wenn ich die Methode direkt im Hauptanwendungs-Thread aufruft, verschwindet dieses Problem. Meine Frage lautet nun: "Was ist das Problem bei der Verwendung von TransactionScope in einem Threadpool-Thread?". Hinweis Ich bin nicht Starten eines Transaktionsbereichs vor Aufruf des neuen Threads, es ist alles innerhalb einer Methode auf dem Thread Thread ausgeführt wird.

Antwort

2

Ich habe das Problem gefunden. Es war die squishy organische Komponente, die meinen Computer betreibt.

ThreadPool.QueueUserWorkItem() beginnt mit der Arbeit an einem Threadpool-Thread. Was bedeutet ein background thread. Der Code lief in einer Testkonsolenanwendung, und natürlich hatte ich vergessen, irgendetwas in Main() zu setzen, um das Programm zu beenden, nachdem es ThreadPool.QueueUserWorkItem() aufgerufen hatte. Das bedeutete, dass ich zu dem Zeitpunkt, an dem ich F10 gedrückt hatte, um zur nächsten Zeile zu gehen, das Programm tatsächlich bereits gestoppt hatte, so dass der Debugger sich selbst schloss.

Alles, was ich getan habe, um es zu beheben, war einen Anruf an Console.ReadKey() am Ende Program.Main() hinzufügen und jetzt alles funktioniert wunderbar. Beachten Sie, dass das Problem nichts mit System.Transactions.TransactionScope oder Threadpool-Threads zu tun hatte. Es wäre passiert, egal in welcher Zeile ich meinen Haltepunkt gesetzt habe.

Hinweis:
Wenn Sie denken, ich sollte ein ThreadAbortException gesehen haben, dann oben aus wird darauf verlinkt den Artikel zu lesen, warum das nicht geschehen ist.Hier ist ein direktes Zitat:

Wenn die Laufzeit einen Hintergrund Thread stoppt, weil der Prozess heruntergefahren wird, keine Ausnahme in dem Thread geworfen wird. Wenn Thread jedoch gestoppt, da die AppDomain.Unload Methode die Anwendungsdomäne entladen, wird eine ThreadAbortException in Vordergrund und Hintergrund Threads ausgelöst.

0

Eine wilde Vermutung: der Microsoft Distributed Transaction Coordinator Dienst (MSDTC) wird gestoppt? Dies ist beispielsweise bei Vista standardmäßig der Fall. Trotzdem hätte ich erwartet, dass eine Ausnahme ausgelöst wird, also bin ich mir nicht sicher, warum Sie dieses Verhalten beobachten.

+0

Ja, ich werde das überprüfen. Es sollte nicht DTC verwenden, da es nur einen Transaktionsbereich in einem Thread gleichzeitig gibt und auch TS in einer Test-App funktioniert. Trotzdem könnte ich mich irren, also werde ich nachsehen. Danke für die Erinnerung. –

+0

Nein, das Starten von MSDTC hat leider nicht geholfen. –

0

Erstens, alles im Windows-Ereignisprotokoll?

Wenn nichts, können Sie etwas Glück haben, indem Sie einen Debugger an Visual Studio anfügen - entweder Visual Studio selbst oder NTSD (Teil von Debugging Tools for Windows). Wenn das fehlschlägt, kann die Peer-Code-Überprüfung helfen (eine zweite Gruppe von Augen bemerkt vielleicht etwas) oder versuchen Sie es mit einem Schrotflinten-Ansatz - entfernen Sie systematisch Code, bis Sie feststellen, warum diese App fehlschlägt, wenn eine andere Anwendung TransactionScope nicht verwendet.