【发布时间】:2011-08-16 14:47:03
【问题描述】:
我会马上说这个。我是线程的业余爱好者。我是一名高级 c# web 开发人员,但我有一个项目需要我填充很多需要很长时间才能填充的对象,因为它们需要 WebRequests 和 要填充的响应。在没有 threading 的情况下,我的一切都可以正常工作,但它的运行速度不足以满足我的要求。我想将所有内容传递给ThreadPool,以便为我管理 threading,因为我可能会同时排队 20,000 个线程,原因很明显。我不想通过一次填充所有请求所需的请求访问网站。
我想做的是传入一个object,填充它,然后将它添加到主thread中的一个collection > 一旦它被填充。然后,一旦填充了所有对象,继续执行程序。在全部填充之前,我不知道需要填充多少对象。
我的问题...最好的方法是什么?
这是我要加速的循环:
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 个请求,您可能会获得小幅加速,但在此之上不会有太大改进。您需要的是某种“调度程序”,它保留未完成任务的列表,并始终保持少量任务并行运行。任务将其结果写入共享集合。当所有任务完成时,调度程序会设置一个信号。
标签: c# .net multithreading .net-4.0 threadpool