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