我会马上说出这个问题。我是线程的业余爱好者。我是一个高级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