【发布时间】: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<ITask>,而是使用BlockingCollection<ITask>,并且它添加了一些功能,例如在没有工作可做时让 OrderTaskLoop 停止旋转,也可以选择让它停止添加如果集合太满。
标签: c# multithreading concurrency concurrent-queue