【问题标题】:new System.Transactions.TransactionScope() on background thread halts program后台线程上的新 System.Transactions.TransactionScope() 停止程序
【发布时间】:2009-05-08 10:01:18
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# crash transactionscope


    【解决方案1】:

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

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

    我所做的只是在Program.Main() 的末尾添加对Console.ReadKey() 的调用,现在一切正常。请注意,该问题与System.Transactions.TransactionScope 或线程池线程无关。不管我把断点放在哪一行都会发生。

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

    当运行时停止后台 线程,因为进程正在关闭 下来,不抛出异常 线。然而,当线程 由于 AppDomain.Unload 停止 方法卸载应用程序域, 抛出 ThreadAbortException 前景和背景 线程。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我会仔细检查。它不应该使用 DTC,因为一个线程一次只有一个事务范围,而且 TS 在测试应用程序中也可以正常工作。我仍然可能是错的,所以我会检查。谢谢提醒。
      • 不,很遗憾,启动 MSDTC 并没有帮助。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-21
        • 1970-01-01
        相关资源
        最近更新 更多