C# 我应该将任务封装在类中吗?

C# 我应该将任务封装在类中吗?,c#,class,backgroundworker,task,task-parallel-library,C#,Class,Backgroundworker,Task,Task Parallel Library,我正在构建一个具有多个长时间运行的工作线程的应用程序,这些线程需要全天候运行。每个worker都是名为Bot的类中的一个方法。Bot的启动/停止由类本身控制。因此,如果我需要运行10个Bot,我只需要实例化10个Bot,存储在列表中,然后启动所有Bot。我还有一个BotManager类来管理当前运行的所有Bot 现在,我想为每个工作人员使用Task而不是Thread,因为他们只花了不到5%的时间做任何处理 我应该在每个类中保留一个任务,还是应该从任务继承我的机器人?我不会从任务下降。你并不是真的

我正在构建一个具有多个长时间运行的工作线程的应用程序,这些线程需要全天候运行。每个worker都是名为
Bot
的类中的一个方法。
Bot
的启动/停止由类本身控制。因此,如果我需要运行10个Bot,我只需要实例化10个
Bot
,存储在
列表中,然后启动所有Bot。我还有一个
BotManager
类来管理当前运行的所有
Bot

现在,我想为每个工作人员使用
Task
而不是
Thread
,因为他们只花了不到5%的时间做任何处理


我应该在每个类中保留一个
任务
,还是应该从
任务
继承我的
机器人

我不会从
任务
下降。你并不是真的扩展了“任务”的概念,并使一些东西,对于使用它的代码来说,是一个具有额外特性的任务;相反,您只是在使用任务来实现它


我也不确定
任务
是否适合这里。如果这种想法是这些产品一直在后台运行,那么这就没有发挥TPL的优势。使用
Task
的最佳时机是当您需要可组合性时——一个定义良好的任务,它运行、完成,然后通知其他任务它已经完成,他们可以开始处理它的结果。

这绝对不是任务的“任务”。使用线程。当您需要确保代码实际正在运行(并且在固定数量的线程上运行)时,不能使用任务。任务不能保证并行执行。您必须自己分配线程。如果您想节省资源,请使用构造函数减少线程堆栈大小。

据我所知,您的要求是运行尽可能多的线程以优化CPU使用。同时,您希望框架负责根据CPU使用情况增加和减少当前正在运行的线程

我认为TPL(任务)是更好的选择。请调查

如果您能分享您希望并行执行的工作性质,我们可以为您提供更多帮助。您所说的全天候运行任务到底是什么意思?您的任务执行什么样的工作?是计算还是IO(数据库操作/Web服务调用)

我假设每个请求由4个步骤组成,这些步骤按以下顺序执行, 1.数据库查找 2.Web服务调用 3.数据库更新 4.记录到文件

正如您所提到的,Web服务调用需要时间,因此最适合异步I/O任务

接着你说

CPU密集型部分将是数据库查找

但我知道db查找不使用CPU,它是一种I/O活动,也是异步I/O任务的良好候选对象

考虑到所有这些假设,我建议如下:

  • DB查找(异步运行,以便释放线程池线程以处理其他请求)
  • Web服务调用(异步运行,以便释放线程池线程以处理其他请求)
  • 数据库更新(同步运行)
  • 日志到文件(根据日志内容大小使用异步日志记录)
  • 据我所知,您的任何步骤都不是CPU密集型的,这就是为什么您只看到5%的CPU使用率

    你还提到,

    然后是随机延迟,以均匀分配负载

    您是否希望尽可能多地运行此类请求(包括这4个步骤)?如果是这样的话,你就不需要放任何额外的东西了。因为当请求等待异步调用时,它会释放线程池线程,系统可以使用它来处理其他请求。这将增加吞吐量

    我应该在每个类中保留一个任务,还是应该从 任务

    1个Bot代表1个请求。任务表示请求中的步骤。因此,在BOT类中创建任务


    使用不同数量的请求运行它,并验证CPU、内存和其他系统资源的使用情况。

    因为只有5%的处理时间,所以使用Task应该更好。我还考虑运行至少100个线程,这是不可取的,我相信使用任务不会神奇地解决您的问题。您需要使用延续等功能来利用任务。CLR是否会利用95%的等待时间来允许处理其他任务?取决于您如何编写这些任务。如果你用连续体写,那么是的。如果您只调用一个阻塞函数,那么不会有任务在线程池线程上运行。如果您明确地说“暂停此线程X个时间量”(例如,
    睡眠
    ),那么不,CLR不能在该线程上执行任何其他工作——您只是告诉它不要!因此,在您的情况下,任务不会比线程更好;您的任务是长期运行的,因此每个任务将有一个线程。您需要将任务分解为更小的部分,然后运行并完成(因此线程池线程可以自由地执行其他任务),并使用计时器而不是休眠。我不需要保证并行执行。我所需要的就是优化CPU,并尽可能多地运行
    Bot
    。如果只有4个Bot同时运行,而其他6个Bot从不运行,您会感到舒服吗?据我所知,你的机器人基本上永远运行。它们全天候运行。因此,他们的任务永远不会退出,这些任务运行的线程也不再可用。我明白了,我想在调用Thread.sleep时,它会切换到其他任务。这不是保证的,在实践中也不会总是发生。使用线程进行长时间运行的工作或在任何情况下都需要运行的工作。感谢您的回复。循环中执行的4个任务是db查找、web服务调用、db更新、日志到文件,然后是随机延迟以均匀分配负载。最耗时的是web服务调用。CPU密集型部分将是数据库查找。感谢