我有一些使用System.Transactions.TransactionScope
的代码,创建事务范围的新实例只会暂停程序。
没有异常或消息,程序只是停止,Visual Studio返回到代码编辑模式。这个过程完全消失了。事件查看器中没有例外,消息或事件。
我有另一个使用TransactionScope的测试应用程序没有问题,所以它不应该是一个环境问题。
我只是不知道如何获取异常细节。我已经在Visual Studio中的Debug-> Exceptions对话框中打开了所有“抛出”复选框,希望VS在抛出异常时自动中断,但事实并非如此。
任何人都可以帮助我了解程序退出的原因吗?
编辑:我刚刚找到了新的东西。 TransactionScope是在通过ThreadPool.QueueUserWorkItem
在后台线程上运行的方法中创建的。如果我只是直接在主应用程序线程上调用该方法,这个问题就会消失。所以现在我的问题是“在线程池线程上使用TransactionScope有什么问题?”。注意我不在调用新线程之前启动事务范围,它都在线程池线程上运行的一个方法中。
答案 0 :(得分:2)
我发现了问题。这是操作我的电脑的软弱有机组件。
ThreadPool.QueueUserWorkItem()
将开始在线程池线程上工作。这意味着background thread。代码在测试控制台应用程序中运行,当然我忘了在Main()
中放置任何内容以在程序调用{{1}}后停止程序退出。这意味着当我按下F10进入下一行时,程序实际上已经停止,因此调试器自行关闭。
我所做的一切就是在ThreadPool.QueueUserWorkItem()
结束时添加对Console.ReadKey()
的调用,现在一切都运行得很好。请注意,该问题与Program.Main()
或线程池线程无关。无论我把断点放在哪一行,都会发生这种情况。
注意强>:
如果您认为我应该看到System.Transactions.TransactionScope
,那么阅读上面链接的文章将指出为什么没有发生。这是一个直接引用:
当运行时停止后台时 线程因为进程正在关闭 下来,没有异常被抛出 线。但是,当线程是 因为AppDomain.Unload而停止了 方法卸载应用程序域, 抛出ThreadAbortException 前景和背景 线程。
答案 1 :(得分:0)
一个疯狂的猜测:Microsoft分布式事务处理协调器服务(MSDTC)已停止?例如,在Vista上默认情况就是如此。不过,我本来期望抛出异常,所以我不确定你为什么会观察到这种行为。
答案 2 :(得分:0)
首先,Windows事件日志中的任何内容?
如果没有,您可能会通过将调试器附加到Visual Studio来获得一些运气 - 无论是Visual Studio本身还是NTSD(Debugging Tools for Windows的一部分)。
如果失败,同行代码审查可能会有所帮助(第二组眼睛可能会注意到某些事情)或尝试使用猎枪方法 - 系统地删除一些代码,直到您发现为什么此应用程序失败时另一个使用TransactionScope的应用程序不会。 / p>