我們有一個我們正在支持的舊項目,並且最有可能由於多線程而發生的問題。 原執行者在執行問題部分之前通過執行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