我们正在支持一个旧项目,由于多线程问题,可能会出现问题。原始实现者通过在执行有问题的部分之前进行
在过去的一个月中,我们一直在尝试使用更低的睡眠值,但我们希望找到根本原因。在调查期间,我们在所有感觉有帮助的私有对象上进行了
它是.net 2.0,因此没有
我已经尝试使用
我们仍然遇到问题。
问题基本上是数据集损坏和对象中的空值,这些空值不应该存在。 它大约每25-100次迭代发生一次,因此复制不是直接的,但我们已经设计了一个专门用于此问题的测试来尝试复制它。
所有这些都指向线程问题的方向。
回到最初的问题 - 谁可能会产生这些额外的线程,我们如何防止创建这些线程? 请注意标有红色的线程 - 它们是后台线程,在代码中我们没有看到任何与它们相关的提及。
屏幕截图中可疑的线程正在积极修改
此应用程序的 CPU 亲和力设置为 1 核心 [原始工作区的一部分]
谢谢
编辑:数据库是 Oracle 12c,但我们面临的问题发生在写入数据库之前。它们通常发生在 DataSets 中,其中整个记录或其几列可能会在每几次测试迭代中被清除。
Thread.sleep
来“修复”它。
这个解决方法有效,但由于该部分位于循环内,thread.sleep
会使该部分完成所需时间增加多分钟。在过去的一个月中,我们一直在尝试使用更低的睡眠值,但我们希望找到根本原因。在调查期间,我们在所有感觉有帮助的私有对象上进行了
lock
。
我们寻找任何可能产生额外线程的东西-但没有找到。
没有Thread.start和ThreadPool使用。
让我们困惑的是,在调试过程中,我们发现我们的主线程处于大约8个其他线程的中间,而我们不知道谁生成了它们。
这些是后台线程,所以我首先想到的是线程池,但正如我提到的,在代码中没有提到它。它是.net 2.0,因此没有
Async
。
这只是更大应用程序的一部分,因此它是Windows服务,但我们将其作为CMD运行,以便轻松调试它。主要应用程序本身是Windows窗体桌面应用程序。
它还使用COM+组件,如果有任何帮助的话。我已经尝试使用
[STA]
替代[MTA]
。
还有如上所述的锁定。
还有MemoryBarrier
。我们仍然遇到问题。
问题基本上是数据集损坏和对象中的空值,这些空值不应该存在。 它大约每25-100次迭代发生一次,因此复制不是直接的,但我们已经设计了一个专门用于此问题的测试来尝试复制它。
所有这些都指向线程问题的方向。
回到最初的问题 - 谁可能会产生这些额外的线程,我们如何防止创建这些线程? 请注意标有红色的线程 - 它们是后台线程,在代码中我们没有看到任何与它们相关的提及。
屏幕截图中可疑的线程正在积极修改
dataset
中的列。问题在于,调用执行该线程的 SetColValueOnRow
函数的方法是典型的,并且不使用任何类型的线程。此应用程序的 CPU 亲和力设置为 1 核心 [原始工作区的一部分]
谢谢
编辑:数据库是 Oracle 12c,但我们面临的问题发生在写入数据库之前。它们通常发生在 DataSets 中,其中整个记录或其几列可能会在每几次测试迭代中被清除。