后台线程上的新System.Transactions.TransactionScope()暂停程序

时间:2009-05-08 10:01:19

标签: c# crash transactionscope

我有一些使用System.Transactions.TransactionScope的代码,创建事务范围的新实例只会暂停程序。

没有异常或消息,程序只是停止,Visual Studio返回到代码编辑模式。这个过程完全消失了。事件查看器中没有例外,消息或事件。

我有另一个使用TransactionScope的测试应用程序没有问题,所以它不应该是一个环境问题。

我只是不知道如何获取异常细节。我已经在Visual Studio中的Debug-> Exceptions对话框中打开了所有“抛出”复选框,希望VS在抛出异常时自动中断,但事实并非如此。

任何人都可以帮助我了解程序退出的原因吗?

编辑:我刚刚找到了新的东西。 TransactionScope是在通过ThreadPool.QueueUserWorkItem在后​​台线程上运行的方法中创建的。如果我只是直接在主应用程序线程上调用该方法,这个问题就会消失。所以现在我的问题是“在线程池线程上使用TransactionScope有什么问题?”。注意我在调用新线程之前启动事务范围,它都在线程池线程上运行的一个方法中。

3 个答案:

答案 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>