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

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

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

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

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

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

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

参考方案

我发现了问题。这是运行我的计算机的柔软有机成分。

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

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

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

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

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…

LeetCode题解黑白圆盘

一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可

LeetCode题解圆上任取三点构成锐角三角形的概率

来自字节跳动的一道几何题题解:1/4

LeetCode题解深度优先遍历和回溯的关系?

深度优先遍历的范围更大还是回溯的范围更大?为什么?题解:我的理解是:dfs是回溯思想的一种体现- 回溯:是在整个搜索空间中搜索出可行解,在搜索过程中不断剪枝回退,这是回溯的思想,这个搜索空间并没有限制于特定的数据结构。- dfs:dfs是指特定的数据结构中如图,树(特殊的图)中搜索答案,范围限制在了特定的数据结构。个人拙见。