C# 处理多个任务,多次并行处理任务

C# 处理多个任务,多次并行处理任务,c#,multithreading,task-parallel-library,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

这可能不适合这里,请随意移动、大声喊叫或辱骂

我们目前有一个控制台应用程序,由另一个启动并传入“作业”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来处理这些项。然而,我正在努力找到一个合适的框架来进行投票,然后处理这些项目,并且正在寻找关于如何实现这一点的建议

我知道很模糊,但希望能提供一些信息


非常感谢我的经验和这句话:

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

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

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

只需使用:

Task.Factory.StartNew(() => DoSomeWork());
每当你想异步运行某个东西时,它就会在幕后完成所有的智能工作

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

我有一个windows服务,可以运行1到500个任务,从来没有遇到过问题

希望这有帮助


Bab.

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

如果您在DB表中轮询新记录,更好的方法是安装插入触发器(可能还有更新和删除触发器)并在插入新记录时向您的服务发送消息


请参见MSDN。

您能描述一下这些记录的来源吗?它们是否被添加到数据库中?目前它们是列表,但它们最终来自数据库。它们以1000个为一批进行加载,并发送到线程池。一旦该批处理中没有剩余处理,我们将检查更多。这是否与sql server对话?+1获取触发器。如果你有一个数据库,你也可以使用它的功能。500个任务可以,但我不确定10000个这样的任务是否合适。