// procedural
foreach (var foo in bar)
{
foo.someProperty = getData(ref foo);
}
// threaded
foreach (var foo in bar)
{
ThreadStart work = delegate
{
getData(ref foo);
};
new Thread(work).Start();
}
getData(ref foo){
// Either a LINQ query
// Or Exec Command to Stored procedure in SQL Server
// Either taking approx 2 seconds to return results
foo.someProperty = resultsFromDBOrLinqStatement;
}
如果酒吧20項然後簡單地使用程序foreach循環花費大約10秒慢 - 執行一個又一個的請求,調用DB每次。多線程是不是程序版本
如果對於相同的數據,使用每個循環的線程,請求需要更長的時間?它看起來像即使線程都很好,向數據庫發出的請求 - 從每個線程 - 都在持續着。
如果我修改getData()方法來;所有線程在幾乎相同的時間脫火和同時運行4秒鐘後退出 -
getData(ref foo){
thread.sleep(4000);
}
然後,正如所料,整個請求是在4秒內完成。
我是否缺少與每個線程中數據庫調用相關的內容,從而減緩整個過程? - 一些web.config設置併發連接到DB等?
PS。我已經嘗試了並行的foreach和Tasks,但它總是返回到數據庫調用的線程化,使數據庫服務器排隊等待所有調用。
您如何知道所有線程都已經完成執行以測量時間?在你已經顯示的代碼的線程版本中,你只是啓動線程,但沒有同步點。 – 2012-07-19 09:29:25
0.5s每欄 - 非常慢 - 猜測getData正在做相當數量的SQL - 如果它的線程版本速度較慢,您可能已經有一些死鎖正在進行 – BonyT 2012-07-19 09:33:15
我現在有一個基本的監視器(測試時)它在創建每個線程時增加一個線程計數器,並且一旦每個線程調用GetData完成後遞減計數器。 – bbose 2012-07-19 09:33:56