可以将长时间运行的循环分解为c#中的多个线程片

时间:2009-07-16 12:53:44

标签: c# multithreading

我有一个For循环,需要很长时间才能执行,我在循环中创建一个新行并将其添加到数据表中。

我想要的是在多个线程上处理这个长时间运行的进程。例如: - 对于2000行,在一个线程上有一个for循环,在另一个线程上有另外2000个行等等。

请提供一些源代码以在c#中实现此目的。

6 个答案:

答案 0 :(得分:2)

我不太确定为什么每个人似乎都认为你这样做的想法。在许多情况下,通过使用多线程可以大大加快诸如此类的过程。但有些事情需要考虑:

现在正在减缓这个过程的速度是什么? CPU是否是瓶颈而某些核心未被使用?如果是这样,它可能是一个很好的并行目标,如果它是磁盘,网络或内存,那么你将无法通过线程分割它。

订单是否重要?在多线程场景中确保以某种顺序完成任务可能会很麻烦。如果你需要以与for循环运行相同的顺序返回结果,那么你可能需要弄清楚在完成所有内容后对它们进行排序。通过额外处理,您可能无法获得任何收益。

是否有共享资源?多个线程是否会尝试访问同一个对象?更重要的是他们会尝试编辑它(例如计数器)?在这种情况下,您需要使用锁,并且等待访问所花费的所有时间可能使多线程解决方案比单线程解决方案慢(或者至少阻止更多CPU资源)。

考虑到所有这些警告,您可能会从良好的并行实现中找到巨大的好处。有一些库可以为您提供foreach循环的多线程版本,而您只需要很少的工作。例如,有一个Microsoft版本here

答案 1 :(得分:1)

这实际上取决于你的代码在循环中做了什么。循环的每次迭代都是embarrassingly parallel workload吗?在没有看到代码的情况下,不可能判断出你想要做什么是否可行,因为不是每个循环都可以并行化。

答案 2 :(得分:0)

将一个顺序发生的动作(如循环)发生到一个单独的线程是不明智的。

您的性能不会提高。显然,你有一些瓶颈(数据库,如果我理解正确的话),并产生几个线程,将不会提高性能。它甚至会恶化它。

答案 3 :(得分:0)

花费的时间在哪里?如果插入数据库然后更难敲击数据库,可能会使速度变慢!

答案 4 :(得分:0)

重要的是要描述延迟实际来自哪里...我怀疑它不是你的程序的速度,但它的数据库需要时间...多线程不会在这里帮助

答案 5 :(得分:0)

我不确定你会在多个线程上分割你的操作会受益:你有一个共享资源,这对于写操作来说不是线程安全的(DataTable.Rows.Add确实是一个写操作)。 / p>

如果创建每个数据行需要很长时间,您可以拆分{em>创建 DataRow个对象,将它们推入缓冲区,然后再将它们添加到DataTable。< / p>