我bugfixing別人的代碼,它需要年齡在下面的代碼返回完整的數據集:如何使用ThreadPool並行化數據庫查詢?
DataTable dt = someLib.GetDataTable("EXEC [dbo].[CMS_Content_GetAllContents]");
// Copy the DataTable data to list.
foreach (DataRow dr in dt.Rows)
{
ContentInfo aContentDetail = new ContentInfo(
(int)dr["ID"],
(string)dr["ContentName"],
getCategories((int)dr["ID"]),
null,
(string)dr["Publisher"],
(string)dr["Price"],
false);
contentInfoList.Add(aContentDetail); ;
}
private string getCategories(int ContentID)
{
String categories = String.Empty;
String query = String.Format("EXEC [dbo].[CMS_Content_GetContentCategories] @ID = {0}", ContentID);
DataTable dt = clsGlobal.GetDataTable(query);
foreach (DataRow dr in dt.Rows)
{
categories = String.Concat((string)dr["ShortDescription"] + ", ");
}
if (categories.EndsWith(", "))
categories = categories.TrimEnd(new char[] { ',', ' ' });
return categories;
}
這是可悲的,因爲有超過1000行的數據表dt和我不能用它處理存儲過程級別!
我只是想知道如果我可以將getCategories(int)
打電話,以便它可以並行但不知道如何將字符串返回給調用者?
或者,使用Threadpool是不是一個好主意,因爲我聽說Threadpool的工作線程不適用於長時間運行的查詢,如DB調用,因爲IOCompletion端口線程可能無法及時返回,因此工作人員可能會被阻止因爲那個?
任何幫助表示讚賞。
這是一個爛攤子我負責的,儀式? – Chris 2010-07-19 05:34:27
因爲我不確定,所以我沒有發佈答案,但我認爲使用線程做這件事不是個好主意。相反,如果我面對這個問題,我會首先分析找到瓶頸(有些東西可能在您發佈的內容中花費很高),然後如果是DB,我會考慮將GetCategories調用轉換爲一個帶有ID數組的單個調用 - 在代碼中進行類別關聯可能會快很多,而不是在for循環中調用多個數據庫。 – 2010-07-19 05:41:51
您是否在等待要返回的類別時說要執行其他任務?如果沒有,請詳細說明。 – Gabe 2010-07-19 05:43:41