2011-03-09 69 views
2

我有一個需要處理的幾百個項目的循環。是否可以在沒有明確創建新線程的情況下在dotnet中引入多線程?

每個項目通過有條件地設置,其中所述項是使用此的SQLConnection作爲處理的一部分處理的全球的SQLConnection處理。

由於這個原因,所有這些項目都不允許並行處理是至關重要的。

我明白,這是不好的設計,我希望能儘快實用糾正它。

但是它似乎是,儘管我盡了最大努力,該代碼正在經歷某種形式的多線程的。不知何故,其中一個任務引發了一個異常。

這個例外是在違反外鍵約束的,但表明它是針對它沒有業務連接的SQLConnection運行。

當然,我對此有顧慮,但據我所知,在這個程序沒有多線程代碼。

不知是否有可能引入多線程沒有明確地創建新線程

編輯:

  • VB.Net 3.5SP1
  • 控制檯應用程序+類庫
  • 偶爾電話網絡服務
  • 使SQL調用
  • 沒什麼別的。沒有Winforms,沒有WPF。
+0

您可能想要確定您正在使用的套接字(WCF,WinForms,...)以外的類型的庫。 – 2011-03-09 14:35:06

+0

Webservices?這聽起來像插座:) – 2011-03-09 14:41:22

回答

1

是的 - 使用System.Timers.Timer和/或System.Threading.Timer可以導致您描述的效果。每當一個計時器滴答一個新的工作項在ThreadPool中排隊時 - 所以基本上你有一個多線程程序而不顯式創建新線程。

如果計時器自動復位(經過被稱爲啓用後遺體),你可能會導致另一個調用相同的處理同時進行。

+0

有趣。沒有直接引用該類。但是有對System.Threading.Thread.Sleep(1000)的調用。這可能導致類似嗎? – 2011-03-09 14:36:44

+0

Nope - Sleep只會暫停當前線程。 – 2011-03-09 15:33:51

1

或者任務(即任務對象)不稱爲線程,但是。通常在lambda表達式附近找到任務,檢查是否有任何。

哦,還有異步套接字以及所有其他的異步IO。

但是:

而不是試圖不惜一切代價避免多線程,那豈不是更容易鎖定?對不起,如果問題很天真,我可能會錯過一些東西。

+0

好的建議 - upvoted。但是在這段代碼中沒有使用套接字。和.Net 3.5(應該提到),所以沒有任務 – 2011-03-09 14:34:03

+0

只是出於好奇,如果你不使用套接字,你是否使用管道?你在你的問題中提到了一個連接。 – 2011-03-09 14:38:10

+0

對不起,我的意思是一個SQLConnection到數據庫。有幾個數據庫可能會被選中。全部具有相似的結構。我已經修改了我的問題以反映這一點。 – 2011-03-09 14:43:04

1

除了已經提到的其他人:並行擴展(PLINQ和任務並行庫)。

0

難道你的代碼是從第三方庫調用的。通過使用事件,另一個庫可以調用您的代碼 - 從儘可能多的線程調用它。
我建議你檢查一下調用代碼的代碼,確保沒有可疑的代碼調用。

相關問題