【问题标题】:What may be strategy when Queue of task execution very big?当任务执行的队列很大时可能是什么策略?
【发布时间】:2015-12-18 11:58:27
【问题描述】:

我有ConcurrentQueue TasksCollection,其中包含ITask 对象。它不是 .Net 框架的Task 类。

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;      
    }
}

所以,当某些事件发生时,我创建 ITask 并添加到 ConcurrentQueue 新任务。 在线程循环中,我获取每个任务并执行它(同步且一致地执行一些代码。看来,我不能并发它。

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
           }
    }
}

所以,在我的情况下,我认为我可以清除队列并继续工作,因为我的跑步者在实时环境中工作。但是,这种情况可能存在某种模式吗? ConcurrentQueue计数太大怎么办?

谢谢!

【问题讨论】:

  • 当队列太大时停止和停止向队列添加东西不是更有意义吗?添加一些只会被消费者清除的东西是没有意义的......
  • 默认情况下,它使用 ConcurrentQueue,而不是 ConcurrentQueue&lt;ITask&gt;,而是使用 BlockingCollection&lt;ITask&gt;,并且它添加了一些功能,例如在没有工作可做时让 OrderTaskLoop 停止旋转,也可以选择让它停止添加如果集合太满。

标签: c# multithreading concurrency concurrent-queue


【解决方案1】:

实际上,一旦任务到达的速度快于它们的处理速度,我可以建议以下几个选项:

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

  2. 更快地处理任务以避免队列长度增加。
    a) 审查任务处理并找到减少处理时间的方法。
    b) 找到并行运行任务处理的方法。如果任务不能完全并行,它们可能是部分并行的。

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

最合适的选项取决于具体情况和项目需求。
也可以考虑这些选项的组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多