这可能不合适,请随时移动,喊叫或滥用。
我们目前有一个控制台应用程序,由另一个启动并传入“作业”的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 :(得分: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。