将对象传递给线程并在线程运行后将其恢复

时间:2011-05-01 20:47:52

标签: c# .net multithreading .net-4.0 threadpool

我会马上说这个。我是线程的业余爱好者。我是一名高级 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方法运行我传递的指令,告诉它如何填充对象。然后我将它添加到集合中。此外,对象本身可能具有需要此方法运行并填充其数据的属性。

3 个答案:

答案 0 :(得分:2)

由于您可能需要等待它们全部完成,因此您需要的只是Parallel.ForEach()或等效物。和线程安全的集合。请注意,对于I / O密集型任务,您可能希望限制线程数。在任何情况下,20.00个线程都会疯狂。

但我们需要查看更多细节(代码)。请注意,没有“主线程中的集合”这样的东西。

答案 1 :(得分:1)

  

填充了很多需要的对象   他们需要很长时间来填充   Web请求和响应

如果您正在请求,请避免线程化。 两个线程之后没有加速,只是存在两个线程。 很多人无所事事。

答案 2 :(得分:0)

一些建议:

如果您使用.net 4,请尝试使用Tasks。您可以更好地控制计划。尝试不共享任何对象,使它们不可变,以及所有警告和best practices关于同步,共享数据等。

其次,您可能需要考虑像message queues这样的流程外解决方案(xMQ产品或穷人的数据库表作为队列),因此如果您需要,您将有机会在多台计算机上分配任务