2009-07-16 41 views
0

被分解为多个线程片我有一个for循环,这需要很长的时间来执行,我在循环创建一个新的行并将其添加到数据表。可循环长期运行在C#

我想是处理这种长时间运行的进程在多个threads.For如: - 2000年线有一个用于环路上的一个线程,另外2000线在另一个线程等等。

请提供一些源代码在c#中实现这一点。

+1

除非您发布代码,否则您将无法获得明确答案。并行化代码(通常)是不平凡的,数据之间的微妙交互可能使其无法获得有意义的加速。做错了,你甚至可以让你的代码变慢或产生不正确的输出。 – tvanfosson 2009-07-16 13:05:03

回答

0

产卵的动作顺序发生,如一个循环,以一个单独的线程是不明智的。

您的表现不会提高。显然你有某种瓶颈(DB,如果我理解正确的话),并产生了几个线程,将不会提高性能。它甚至会恶化它。

+0

不涉及数据库交互,只涉及一些字符串操作。 – Rohit 2009-07-16 13:00:02

0

花费的时间在哪里?如果插入到数据库中,那么更难以触及数据库可能会使这种情况变得更慢!

+0

迭代需要时间,有数百万条记录,我必须逐行阅读并做一些操作。我在for循环结束后使用sqlbulkcopy插入数据库。插入需要大约一分钟,但操作需要10分钟。 – Rohit 2009-07-16 12:57:50

1

这真的取决于你的代码在循环中做什么。循环的每次迭代是否为embarrassingly parallel workload?在没有看到代码的情况下,不可能知道你想做什么是可行或不可行的,因为不是每个循环都是可并行化的。

0

其重要的轮廓,其中的延迟实际上是来自哪里......我怀疑它不是你的程序的速度,但它的数据库这就是花时间......多线程不会帮助这里

0

我不知道您将从多个线程拆分操作中受益:您有一个共享资源,这对于写操作而言不是线程安全的(DataTable.Rows.Add确实是一个写操作)。

如果每个数据行需要很长的创建,可以拆分创作DataRow对象,他们推入缓冲区,然后才添加这些到DataTable

2

我不太确定为什么每个人似乎都对你这样做的想法感到失望。有很多情况下,像这样的过程可以通过使用多线程大大加快。有些事情要考虑,但:

什么是唐氏现在放缓的过程? CPU是瓶颈,一些核心未被使用?如果是这样的话,它可能是一个很好的并行目标,如果它是磁盘,网络或内存,那么你就不会通过线程分裂获得任何东西。

命令是否重要?确保事情按照某种顺序完成可能是多线程场景中的一个痛苦。如果您需要结果以与for循环相同的顺序返回,那么您可能需要弄清楚如何在之后的所有内容都已完成后对其进行排序。有了这额外的处理,你可能无法获得任何东西。

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

考虑到所有这些需要注意的地方,虽然,你可以从一个良好的并行执行发现巨大的效益。有一些库可以为你提供一个foreach循环的多线程版本,而你的工作很少。例如,有一个Microsoft版本here