使用Task Parallel处理很多次任务

时间:2012-04-25 14:02:58

标签: c# multithreading task-parallel-library

这可能不合适,请随时移动,喊叫或滥用。

我们目前有一个控制台应用程序,由另一个启动并传入“作业”的ID,此作业将有多个需要处理的记录。对流程的简单解释是:

Starts 50 threads

Gets records to be processed.
if records > 0 see what threads are not still busy and send it some information.
if records = 0 update something else and exit.
Get more records.
Loop.

现在,我希望将此转换为持续运行的“轮询”服务,并且当新记录可用时,处理它们。拿走我所拥有的并转换它是相当简单的,但线程的东西很旧,可能已经过时了。

我希望重构大部分(如果不是全部)并使用Task.Parallel来处理这些项目。但是,我正在努力获得一个合适的轮询框架,然后处理这些项目,并正在寻找有关如何实现这一目标的建议。

我知道这很模糊,但希望能提供某种意见。

非常感谢

3 个答案:

答案 0 :(得分:1)

根据我的经验和msdn引用:

  

更高效,更可扩展地使用系统资源。

     

在幕后,任务排队到ThreadPool,一直是   增强了算法(如爬山),确定和   调整到最大化吞吐量的线程数。这使得   任务相对轻量级,你可以创建其中的许多   实现细粒度并行。为了补充这一点,广为人知   工作窃取算法用于提供负载平衡。

您根本不应该关心有多少任务是一个好数字,或者如何创建一个系统来平衡所涉及的线程。

只需使用:

Task.Factory.StartNew(() => DoSomeWork());

每当你想要异步运行某些东西时,它就会完成所有智能工作。

既然你可能会在一个循环中创建任务,请要格外小心不要引入许多人(包括我)的封闭错误,你可以查找 here

我有一个运行1到500个任务的Windows服务,从来没有遇到过麻烦。

希望这有帮助,

巴布。

答案 1 :(得分:1)

如果要在数据库表中轮询新记录,更好的方法是在此表上安装INSERT触发器(可能还有UPDATE-和DELETE-触发器),并在a时向服务发送消息插入新记录。

请参阅MSDN上的Posting Message to MSMQ from SQL Server

答案 2 :(得分:0)

"投票服务"听起来像一个可观察的集合的好例子。有Rx,一个处理它们的好方法(http://rxwiki.wikidot.com/101samples),我认为它使用TPL。