繁体   English   中英

具有连续(无尽)任务的线程管理控制台程序

[英]Thread management console program with continuous (endless) tasks

我是线程技术的新手,请耐心等待。

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

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

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

所以我想我将ThreadPool与常规Threads一起使用。

为了使事情变得简单,我只想保持恒定数量的线程(在一个线程结束时生成新线程),直到我用尽所有要做的事情(然后我等待数据(通常是很多)到达数据库并生成线程) )。 我需要知道线程何时结束,因为我必须产生一个新线程并更新包含正在使用的数据的数据库行。 为了使线程和数据库保持同步,我可能不得不在检索数据库行时用某种线程ID对其进行标记,然后在线程结束时将该行标记为(成功/失败)。 此解决方案 (尝试在线程委托中进行捕获)是否足以确保线程已结束(并且是否成功或引发了异常)?

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

我还认为我不想提前读取太多数据(并可能等待线程释放),因为可能会有其他程序使用相同的数据库执行相同的操作。

任何想法表示赞赏!

只需使用Parallel.ForEach即可:

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

如果由于自动分区器恰好使用了太多线程池线程而需要指定最大并行度,则可以这样指定:

Parallel.ForEach(rows, new ParallelOptions() { MaxDegreeOfParallelism = 5 }
    , row => ProcessRow(row));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM