новый System.Transactions.TransactionScope () в фоновом потоке останавливает программу - PullRequest
0 голосов
/ 08 мая 2009

У меня есть код, использующий System.Transactions.TransactionScope, который при создании нового экземпляра области транзакции просто останавливает программу.

Нет никаких исключений или сообщений, программа просто останавливается, и Visual Studio возвращается в режим редактирования кода. Процесс полностью ушел. В средстве просмотра событий нет исключений, сообщений или событий.

У меня есть другое тестовое приложение, которое без проблем использует TransactionScope, поэтому это не должно быть проблемой среды.

Я просто не знаю, как получить детализацию исключения. Я включил все «брошенные» флажки в диалоговом окне «Отладка -> Исключения» в Visual Studio, надеясь, что VS автоматически сломается при возникновении исключения, но это не так.

Может кто-нибудь помочь мне выяснить причину выхода из программы?

РЕДАКТИРОВАТЬ: Я только что нашел что-то новое. TransactionScope создается в методе, работающем в фоновом потоке через ThreadPool.QueueUserWorkItem. Если я просто вызову метод непосредственно в главном потоке приложения, эта проблема исчезнет. Итак, теперь мой вопрос «в чем проблема с использованием TransactionScope в потоке потоков?». Обратите внимание, что я не запускаю область транзакции до вызова нового потока, все это в одном методе, выполняемом в потоке потоков.

Ответы [ 3 ]

2 голосов
/ 08 мая 2009

Я нашел проблему. Это был мягкий органический компонент, который управляет моим компьютером.

ThreadPool.QueueUserWorkItem() начнет работу с потоком пула потоков. Что означает фоновый поток . Код выполнялся в тестовом консольном приложении, и, конечно же, я забыл поместить что-либо в Main(), чтобы остановить выход из программы после вызова ThreadPool.QueueUserWorkItem(). Это означало, что к тому времени, когда я нажал клавишу F10, чтобы перейти к следующей строке, программа фактически уже остановилась, поэтому отладчик закрылся сам.

Все, что я сделал, чтобы это исправить, это добавил вызов Console.ReadKey() в конце Program.Main(), и теперь все работает прекрасно. Обратите внимание, что проблема не имеет ничего общего с System.Transactions.TransactionScope или потоками пула. Это случилось бы независимо от того, на какую линию я поставил точку останова.

Примечание
Если вы думаете, что я должен был увидеть ThreadAbortException, то, прочитав статью, приведенную выше, укажет, почему этого не произошло. Вот прямая цитата:

Когда среда выполнения останавливает фон поток, потому что процесс закрывается вниз, не исключение нить. Тем не менее, когда потоки остановлен, потому что AppDomain.Unload метод выгружает домен приложения, исключение ThreadAbortException как передний план, так и фон резьб.

0 голосов
/ 08 мая 2009

Во-первых, что-нибудь в журнале событий Windows?

Если ничего, вы можете испытать удачу, подключив отладчик к Visual Studio - либо к самой Visual Studio, либо к NTSD (часть Средства отладки для Windows ).

Если это не помогло, может помочь рецензирование кода (второй набор глаз может что-то заметить) или попробовать подход с использованием дробовика - систематически удаляйте фрагменты кода, пока не обнаружите, почему это приложение перестает работать, когда другое приложение, использующее TransactionScope, не делает этого.

0 голосов
/ 08 мая 2009

Одна дикая догадка: служба координатора распределенных транзакций Microsoft (MSDTC) остановлена? Это случай по умолчанию в Vista, например. Тем не менее, я ожидал, что будет сгенерировано исключение, поэтому я не уверен, почему вы наблюдаете такое поведение.

...