我会马上说这个。我是线程的业余爱好者。我是一名高级 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 });
}
我事先不知道对象是什么,所以我使用Activator创建它。 RunOrdering方法运行我传递的指令,告诉它如何填充对象。然后我将它添加到集合中。此外,对象本身可能具有需要此方法运行并填充其数据的属性。
答案 0 :(得分:2)
由于您可能需要等待它们全部完成,因此您需要的只是Parallel.ForEach()
或等效物。和线程安全的集合。请注意,对于I / O密集型任务,您可能希望限制线程数。在任何情况下,20.00个线程都会疯狂。
但我们需要查看更多细节(代码)。请注意,没有“主线程中的集合”这样的东西。
答案 1 :(得分:1)
填充了很多需要的对象 他们需要很长时间来填充 Web请求和响应
如果您正在请求,请避免线程化。 两个线程之后没有加速,只是存在两个线程。 很多人无所事事。
答案 2 :(得分:0)
一些建议:
如果您使用.net 4,请尝试使用Tasks。您可以更好地控制计划。尝试不共享任何对象,使它们不可变,以及所有警告和best practices关于同步,共享数据等。
其次,您可能需要考虑像message queues这样的流程外解决方案(xMQ产品或穷人的数据库表作为队列),因此如果您需要,您将有机会在多台计算机上分配任务