我有一些使用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题解统计城市的所有灯泡这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…
LeetCode题解黑白圆盘一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可
LeetCode题解圆上任取三点构成锐角三角形的概率来自字节跳动的一道几何题题解:1/4
LeetCode题解深度优先遍历和回溯的关系?深度优先遍历的范围更大还是回溯的范围更大?为什么?题解:我的理解是:dfs是回溯思想的一种体现- 回溯:是在整个搜索空间中搜索出可行解,在搜索过程中不断剪枝回退,这是回溯的思想,这个搜索空间并没有限制于特定的数据结构。- dfs:dfs是指特定的数据结构中如图,树(特殊的图)中搜索答案,范围限制在了特定的数据结构。个人拙见。