0

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

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

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

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

谁能帮我找出程序退出的原因?

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

4

3 回答 3

2

我发现了问题。它是操作我电脑的柔软有机组件。

ThreadPool.QueueUserWorkItem()将开始在线程池线程上工作。这意味着一个后台线程。该代码在一个测试控制台应用程序中运行,当然我忘记了放入任何东西Main()来阻止程序在调用ThreadPool.QueueUserWorkItem(). 这意味着当我按下 F10 进入下一行时,程序实际上已经停止了,所以调试器自己关闭了。

Console.ReadKey()我所做的只是在最后添加一个调用来修复它Program.Main(),现在一切正常。请注意,该问题与线程池线程无关System.Transactions.TransactionScope。无论我把断点放在哪一行,它都会发生。

注意
如果您认为我应该看到 a ThreadAbortException,那么阅读上面链接的文章会指出为什么没有发生这种情况。这是一个直接的报价:

当运行时因为进程正在关闭而停止后台线程时,线程中不会引发异常。但是,当线程因 AppDomain.Unload 方法卸载应用程序域而停止时,前台和后台线程都会引发 ThreadAbortException。

于 2009-05-08T11:35:40.723 回答
0

一个疯狂的猜测:Microsoft 分布式事务协调器服务 (MSDTC) 已停止?例如,在 Vista 上默认情况下就是这种情况。不过,我预计会引发异常,所以我不确定你为什么会观察到这种行为。

于 2009-05-08T10:06:19.923 回答
0

首先,Windows 事件日志中有什么内容吗?

如果没有,您可能会通过将调试器附加到 Visual Studio 来获得一些运气 - Visual Studio 本身或 NTSD(Windows 调试工具的一部分)。

如果失败了,同行代码审查可能会有所帮助(第二双眼睛可能会注意到某些事情)或尝试一种霰弹枪方法 - 系统地删除一些代码,直到您发现为什么这个应用程序失败而另一个使用 TransactionScope 的应用程序没有失败。

于 2009-05-08T11:07:45.253 回答