我们有一个我们正在支持的旧项目,并且最有可能由于多线程而发生的问题。 原执行者在执行问题部分之前通过执行Thread.sleep
'固定'它。 解决方法可行,但由于该部分位于循环内,因此thread.sleep
会在该部分完成所需的时间内添加多个分钟。有没有办法强制应用程序作为单线程运行?
在过去的一个月中,我们一直在尝试用较低的睡眠值,但我们希望找到根本原因。在我们的调查中,我们对私人物品做了lock
,只要我们觉得这样会有所帮助。 我们寻找任何可能产生额外线程的东西 - 无法找到。 没有Thread.start并且没有ThreadPool用法。 令我们困惑的是,在调试过程中,我们发现我们的主线程在大约8个其他线程中,我们不知道是谁产生了它们。 这些是后台线程,所以首先想到的是线程池,但正如我提到的代码中没有提到它。
它是.net 2.0所以没有Async
s。 这只是大型应用程序的一部分,所以它是一个Windows服务,但我们将其作为CMD运行,以便能够轻松进行调试主应用程序本身是一个Windows窗体桌面应用程序。 它也使用COM +组件,如果有任何帮助。
我试过[STA]
而不是[MTA]
。 也如上所述锁定。 MemoryBarrier
也是如此。
我们仍然遇到问题。
该问题基本上是损坏的数据集和对象的空值,他们不应该。 它发生在每25-100次迭代大约一次,因此再生不是直接进行的,但我们专门为此问题设计了一个测试来尝试再现它。
所有这些都将我们引向线程问题的方向。
回到最初的问题 - 谁可能通过产生这些额外的线程,我们如何防止这些线程被创建?
请注意标有红色的线 - 这些都是后台线程而据我们可以看到没有提到他们的代码。
截图中的可疑线程正在主动修改dataset
中的列。问题是 - 调用线程执行的SetColValueOnRow
函数的方法是典型的,并且不使用任何类型的线程。
此应用程序的CPU关联设置为1个核心[原工作周围的部分]
感谢
编辑:数据库是Oracle 12c的,但写之前,我们面对发生的问题数据库。 他们通常在数据集,其中整个记录或它的一些列的可擦一次每隔几个测试迭代
什么类型的应用程序(winforms,service,...) – pm100
这只是更大的应用程序的一部分,所以它是一个Windows服务,但我们将其作为CMD运行,以便能够轻松进行调试 主应用程序本身是一个Windows窗体桌面应用程序。 – AngelicCore
当再现/调试这个问题时,我们只运行这个部分,我们不运行应用程序的其余部分。 – AngelicCore