我正在构建一个具有多个长时间运行的工作线程的应用程序,这些线程需要全天候运行。每个worker都是名为Bot
的类中的方法。 Bot
的开始/停止由类本身控制。因此,如果我需要运行10个机器人,我只需要实例化10 Bot
,存储在List<Bot>
中,然后启动所有机器人。我还有一个BotManager
课程来管理当前正在运行的所有Bot
现在,我想为每个工作人员使用Task
而不是Thread
,因为他们只花费不到5%的时间进行任何处理。
我应该在每个班级中保留Task
,还是应该从Bot
继承我的Task
?
答案 0 :(得分:3)
我不会从Task
下降。你并没有真正扩展“任务”的想法,而是制造一些东西,对于使用它的代码来说,这是一项具有额外功能的任务;相反,你只是在制作碰巧使用任务来实现的东西。
我也不确定Task
是否适合这里。如果想法是这些继续在后台运行,那么这不会影响TPL的优势。使用Task
的最佳时间是您需要可组合性 - 一个定义明确的任务,运行,完成,然后通知其他任务已完成,并且可以开始处理其结果。
答案 1 :(得分:2)
据我所知,您的要求是尽可能多地运行线程以优化CPU使用率。同时你希望框架负责根据CPU使用情况来增加和减少当前运行的线程。
我会说TPL(任务)会更好。请查看http://msdn.microsoft.com/en-us/library/dd537609.aspx
如果您要分享要并行执行的工作性质,我们可以为您提供更多帮助。 24X7运行任务你到底意味着什么?你的任务有什么样的工作?是计算还是IO(数据库操作/ Web服务调用)?
我假设每个请求包含4个步骤,这些步骤按以下顺序执行, 1. DB查询 2. Web服务调用 3.数据库更新 4.登录文件
正如您所提到的,Web服务调用需要时间,因此最适合异步I / O任务。
接下来你说,
CPU密集型部分将是数据库查找
但我理解db查找不使用CPU,它是一个I / O活动,也是异步I / O任务的良好候选者。
考虑到我建议遵循的所有这些假设,
根据我的理解,您的步骤都不是CPU密集型的,这就是为什么您只看到5%的CPU使用率。
您还提到了,
随后延迟均匀分配负载。
您的意思是尽可能多地运行此类请求(包括这4个步骤)吗?如果是这样,那么你不需要添加任何额外的东西。因为当请求等待异步调用时,它释放线程池线程,系统可以使用它来处理其他请求。这将增加吞吐量。
我应该在每个班级中保留一个任务,还是应该继承我的Bot 任务?
1 Bot代表1个请求。任务代表请求中的步骤。所以在你的BOT课程中创建任务。
使用不同数量的请求运行它,并验证CPU,内存和其他系统资源的使用情况。
答案 2 :(得分:1)
这绝对不是任务的“任务”。使用线程。如果您需要保证,您的代码实际上正在运行(并且在固定数量的线程上),您无法使用任务。任务不保证并行执行。您必须自己分配线程。如果要保存资源,请使用构造函数减少线程堆栈大小。