我會馬上說出這個問題。我是線程的業餘愛好者。我是一個高級c#web開發人員,但我有一個項目,需要我填充很多需要很長時間填充的對象,因爲它們需要填充WebRequests和響應來填充。我有一切工作沒有線程,但它運行速度不夠我的要求。我想將所有內容都傳遞給ThreadPool
以便爲我管理線程,因爲我可能會同時排隊20,000個線程,原因很明顯。我不想打一個網站,要求一次填充所有請求。將對象傳遞給線程並在線程運行後將其取回
我想這樣做是在對象通過,填充它,然後在主線程添加向集合一旦填充。然後,一旦所有對象都被填充,繼續執行程序。我不知道有多少物體需要填充,直到它們全部填充。
我的問題...這樣做的最佳方法是什麼?
這裏是我試圖加快循環:
foreach (HElement hElement in repeatingTag.RunRepeatingTagInstruction())
{
object newObject = Activator.CreateInstance(currentObject.GetType().GetGenericArguments()[0]);
List<XElement> ordering = GetOrdering(tagInstructions.Attribute("type").Value);
RunOrdering(ordering, newObject, hElement);
MethodInfo method = currentObject.GetType().GetMethod("Add");
method.Invoke(currentObject, new[] { newObject });
}
我不知道對象是什麼事前,所以我創建一個使用激活它。 RunOrdering方法遍歷我傳遞的指示信息,告訴它如何填充對象。然後我將它添加到集合中。此外,對象本身可能具有需要此方法運行並填充其數據的屬性。
如果您的程序的目的是發出20,000個Web請求,那麼它並不受限於您將這些任務分配給CPU內核的程度,而是受網絡帶寬的限制。通過並行執行2-5個請求,你可能會獲得很小的加速,但是在這之上並沒有太大的改進。您需要的是某種「調度程序」,它保留未完成任務的列表,並始終保持少量並行運行的任務。任務將結果寫入共享集合。調度程序在所有任務完成時設置一個信號。 – dtb 2011-05-01 20:53:27