0

我是线程新手,所以请耐心等待。

我在数据库中有数万行。每行代表需要通过 Internet 完成的工作。我读取了一个数据行,我做了一些与网络相关的工作(甚至可能需要几秒钟到几分钟的时间),然后我抓取下一个数据行(我的 C# 应用程序使用控制台,而不是 GUI)。正如你所料,我想同时做这些工作。

我研究了这个主题,我想我会使用 BackgroundThreads,但如果我理解正确,人们建议在控制台应用程序中使用它们是没有意义的。

我假设我不应该使用任务,因为我的每个“任务”都将由一个线程表示。

所以我想我会将 ThreadPool 与常规线程一起使用。

为了简单起见,我只想保持恒定数量的线程(当一个线程完成时产生新的线程),直到我用完了要做的事情(然后我等待数据 - 通常是很多数据 - 到达数据库并产生线程)。我需要知道线程何时结束,因为我必须生成一个新线程并更新包含它正在使用的数据的数据库行。为了使线程和数据库保持同步,我可能必须在检索时用某种线程 id 标记数据库行,然后在线程结束时标记该行(成功/失败)。这个解决方案(尝试在线程委托中捕获)是否足以确保线程已经结束(以及它是否成功或抛出异常)?

我不确定如何“等待”第一个线程结束 - 不是全部,也不是特定的。

我还认为我不想提前读取太多数据(并可能等待线程释放),因为可能有其他程序使用同一个数据库做同样的事情。

任何想法表示赞赏!

4

1 回答 1

4

只需用于Parallel.ForEach执行此操作:

Parallel.ForEach(rows, row => ProcessRow(row));

如果您需要指定最大并行化程度,因为自动分区器碰巧使用了太多线程池线程,那么您可以像这样指定它:

Parallel.ForEach(rows, new ParallelOptions() { MaxDegreeOfParallelism = 5 }
    , row => ProcessRow(row));
于 2013-11-13T20:11:18.480 回答