2012-04-25 118 views
0

这可能不适合在这里,如果是这样,请随时移动,呼喊或滥用。处理许多任务,多次与任务并行

我们目前有一个控制台应用程序,由另一个开始并传入一个“作业”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来处理项目。然而,我正在努力争取一个合适的轮询框架,然后处理这些项目,并正在寻求如何实现这一目标的建议。

我非常模糊,但希望能给出某种意见。

非常感谢

+0

你能描述这些记录来自哪里吗?他们被添加到数据库? – 2012-04-25 14:06:24

+0

目前他们是名单,但是他们最终来自DB。它们分批加载并发送到线程池。一旦在该批次中没有剩下可处理的东西,我们会检查更多。 – ChrisBint 2012-04-25 14:08:37

+0

这是说话的sql服务器? – 2012-04-25 14:10:50

回答

1

从我的经验,这msdn报价:

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

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

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

只需使用:要异步运行的东西

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

每一次,它幕后所有的智能工作。

现在,因为你可能会创建一个循环任务,请要额外小心没有引进一个封闭的错误许多人不得不(包括我),你可以看一下here

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

希望这会有所帮助,

Bab。

+0

500任务可能没问题,但我不确定10000是什么。 – svick 2012-04-25 16:59:25

0

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

1

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

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

+0

+1为触发器。如果你有一个数据库,你可以使用它的功能。 – 2012-04-25 15:55:26