我是线程新手所以请耐心等待。
我在数据库中有成千上万的行。每行代表一项需要通过互联网完成的工作。我读了一个数据行,我做了一些与网络相关的工作(甚至可能需要几秒钟到几分钟)我抓住下一个数据行(我的C#应用程序使用控制台,而不是GUI)。正如您所料,我希望同时完成这些工作。
我研究了这个主题,我认为我会使用BackgroundThreads,但如果我理解正确people suggest,在控制台应用程序中使用它们毫无意义。
我假设我不应该使用任务,因为我的每个“任务”都将由一个线程表示。
所以我想我会使用常规线程的ThreadPool。
为了简单起见我只想保持一定数量的线程(当一个完成时产生新的线程)直到我用完了要做的事情(然后我等待数据 - 通常很多 - 到达数据库)并产生线程)。我需要知道Thread何时结束,因为我必须生成一个新线程并更新包含它正在使用的数据的数据库行。为了使线程和数据库保持同步,我可能必须在检索数据库行时使用某种线程标记,然后在线程结束时标记行(成功/失败)。 是this solution(尝试在线程委托中捕获)足以确保线程已经结束(如果它成功或引发了异常)?
我不知道如何“等待”第一个线程结束 - 不是全部而不是特定的线程。
我还认为我不想提前读取太多数据(并且可能等待线程释放),因为可能有其他程序使用相同的数据库执行相同的操作。
任何想法都赞赏!
答案 0 :(得分:4)
只需使用Parallel.ForEach
即可:
Parallel.ForEach(rows, row => ProcessRow(row));
如果您需要指定最大并行度,因为自动分区程序碰巧使用了太多线程池线程,那么您可以像这样指定它:
Parallel.ForEach(rows, new ParallelOptions() { MaxDegreeOfParallelism = 5 }
, row => ProcessRow(row));