C# 当任务执行队列非常大时,策略可能是什么?

C# 当任务执行队列非常大时,策略可能是什么?,c#,multithreading,concurrency,concurrent-queue,C#,Multithreading,Concurrency,Concurrent Queue,我有ConcurrentQueue任务集合,其中包含ITask对象。它不是.Net framework的任务类 public class TaskRunner:IDisposable { private Task _orderTask; public TaskRunner() { TasksCollection = new ConcurrentQueue<ITask>(); } public void Start()

我有
ConcurrentQueue任务集合
,其中包含
ITask
对象。它不是.Net framework的
任务

public class TaskRunner:IDisposable
  {
    private Task _orderTask;

   public TaskRunner()
     {
      TasksCollection = new ConcurrentQueue<ITask>();   
     }

   public void Start()
    {
        _needToStopOrderTask = false;            
        _orderTask = Task.Factory.StartNew(() => OrderTaskLoop());
    }

   public void Stop()
    {
        lock(_lockObject)
            _needToStopOrderTask = true;      
    }
}
所以,在我的情况下,我认为我可以清除队列并继续工作,因为我的跑步者是在实时上下文中工作的。但是,这种情况是否存在某种模式? 如果
ConcurrentQueue
计数太大,我该怎么办


谢谢大家!

事实上,一旦任务到达的速度快于处理速度,我可以建议以下几种选择:

  • 忽略某些任务。
    a) 例如,停止添加新任务(如@Mikael Nitell在评论中建议)。
    b) 或者只是清理队列(就像你自己建议的那样)
    c) 为任务引入超时。任务超时时可能会被删除。对于不同类型的任务,可以使用不同的超时。如果这适合你

  • 更快地处理任务以避免队列长度增长。
    a) 查看任务处理并找到缩短处理时间的方法。
    b) 找到如何并行运行任务处理的方法。如果任务可以完全并行,那么它们可能可以部分并行

  • 如果事件负载不规则,则可能允许更大的队列长度。
    当事件密集到达时-任务正在收集,队列长度正在增加。
    当事件未到达或到达速度较慢时,队列长度会减少,因为任务的处理速度比它们到达的速度快

  • 最合适的选择取决于具体情况和项目需要。

    也可以考虑这些选项的组合。

    当队列太大时,停止并停止向队列中添加东西不是更有意义吗?添加仅由消费者清除的内容没有意义…请使用
    阻止集合,而不是
    ConcurrentQueue
    ,默认情况下,它使用ConcurrentQueue,并添加了一些功能,如在没有工作要做时使OrderTaskLoop停止旋转,以及在集合太满时选择性地使其停止添加。
    private void OrderTaskLoop()
        {
            try
            {
                if (TasksCollection.Count == 0)
                    return;
    
                while (!_needToStopOrderTask)
                {                    
                    if(TasksCollection.Count>100)//too many tasks
                    {
                          //what should i do here?
                    }
    
                    ITask task = null;
                    var tryTake = TasksCollection.TryDequeue(out task);
                    ///execute
               }
        }
    }