我正在构建一个后台处理引擎,它支持丢弃待处理和正在处理的项目。这是为了在winforms应用程序中使用,需要对某些输入元素进行大量处理,因此我正在构建一个队列引擎,我可以在其中将工作负载项排入队列,当它们被处理时,我会收到结果通知。
问题是,这个队列几乎总是包含很多项目,我认为不是只是将所有内容都转储到线程池中,而是将前N个项目放入线程池中,并保持回填当他们被处理。我想这样做的原因是,一旦我将它们转储到线程池中,它们将被处理,即使它们被标记为丢弃,它们仍然会占用队列时间。
使用我已经完成的回填实现,如果它们被丢弃,我可以从队列中删除它们,并且只有轮到它们时才将它们放入队列中,可以这么说。
所以问题是,我将如何计算这个数字N,即放入并保留在线程池队列中的项目数。
我考虑过的问题:
您怎么看?
新:好的,由于其中一个答案,我会再解释一下。放入队列的每个项目都由唯一的键入。如果我使用与现有项目相同的密钥将另一个项目转储到队列中,则该旧项目将被视为“已废弃”,应将其删除。如果正在处理该项,则工作负载项上的属性设置为true,即“IsDicarded”属性,处理方法负责调用该属性。如果它检测到丢弃的项目,它应该提前退出,不返回任何结果。
也许我应该多尝试一下,并尝试将所有内容转储到线程池中。
新问题:我可以排队的项目数量是否有限制?如果没有,那么这很容易简化我的课程。
注意:当我说“冗长处理”时,我的意思是1-10秒。线程池甚至是最好的吗?我在网上看到关于“处理应该很快”的说明,但从未提及“快速”的内容。这里快到几毫秒了?
答案 0 :(得分:1)
您是否可以通过修改项目来简化方法,以便在进行任何工作之前先检查它们是否仍然需要?这样可以解决限制池中数量的问题,因为您可以简单地将它们全部添加,并且当每个项目被处理时,如果不再需要它将退出。
可以进行的操作次数 排队到线程池是有限的 只有可用的记忆;然而 线程池限制了数量 可以在...中激活的线程 同时进行。默认情况下, 限制是每个250个工作线程 CPU和1,000个I / O完成线程。
您可以控制最大数量 线程使用GetMaxThreads和 SetMaxThreads方法。
答案 1 :(得分:1)
你知道Ami Bar的Smart Thread Pool吗?
似乎它的实现允许您取消未处理的项目并根据需要动态增加线程,直到硬限制;我个人使用100 * Environment.ProcessorsCount