将对象传递给线程,并在线程运行后取回对象

本文关键字:线程 对象 运行 | 更新日期: 2023-09-27 17:54:20

我马上就说。我在穿线方面是个业余爱好者。我是一名高级c# web开发人员,但我有一个项目,需要我填充很多需要很长时间来填充的对象,因为它们需要WebRequestsResponses来填充。我有一切工作没有线程,但它运行不够快,以满足我的要求。我想把一切都传递给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方法运行我传递给它的指令,告诉它如何填充对象。然后我把它添加到集合中。此外,对象本身可能具有需要此方法遍历并填充其数据的属性。

将对象传递给线程,并在线程运行后取回对象

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

但是我们需要看到更多细节(代码)。注意,没有所谓的"主线程中的集合"。

填充了许多以a为参数的对象需要很长时间才能满足他们的需求WebRequests和Responses

如果你正在处理请求,避免线程。两个线程之后没有加速,仅仅存在于两个线程中。白费力气。

几个建议:

如果你是在。net 4上尝试使用任务。你可以更好地控制日程安排。尽量不共享任何对象,使它们不可变,以及所有关于同步,共享数据等的警告和最佳实践。

其次,您可能想要考虑一个进程外解决方案,如消息队列(xMQ产品或穷人的数据库表作为队列),这样您就有机会在需要时将任务分发到多台机器上。