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 来处理项目。但是,我正在努力获得一个合适的轮询框架,然后处理这些项目,并正在寻找有关如何实现这一目标的建议。

我知道很模糊,但希望足以提供某种输入。

非常感谢

4

3 回答 3

1

根据我的经验和这个msdn报价:

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

在幕后,任务排队到线程池,该线程池已通过算法(如爬山)进行了增强,该算法可确定并调整线程数以最大限度地提高吞吐量。这使得任务相对轻量级,您可以创建许多任务以启用细粒度并行性。为了补充这一点,采用了广为人知的工作窃取算法来提供负载平衡。

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

只需使用:

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

每次你想异步运行某些东西时,它都会在幕后完成所有聪明的工作。

现在,由于您可能会在循环中创建任务,请格外小心,不要引入许多人(包括我)都有的关闭错误,您可以在此处查找。

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

希望这可以帮助,

呸。

于 2012-04-25T14:12:07.603 回答
1

如果您要轮询 DB 表中的新记录,更好的方法是在该表上安装一个 INSERT 触发器(也可能还有 UPDATE 和 DELETE 触发器),并在有新记录时向您的服务发送消息插入。

请参阅MSDN 上的从 SQL Server 向 MSMQ 发布消息。

于 2012-04-25T14:21:53.860 回答
0

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

于 2012-04-25T14:21:31.283 回答