【发布时间】:2012-05-04 10:53:27
【问题描述】:
我有一个任务或工作项队列,需要在后台按顺序执行。这些任务将属于“即发即弃”类型,这意味着一旦它们开始,我真的不在乎它们是否完成,不需要取消或状态更新。如果他们没有完成,用户将能够重试或手动诊断。
目标是能够保持对队列的引用并且只需要这样做
myQueue.Add( () => DoMyStuff() );
为了向队列中添加一些东西。
System.Threading.Task 类似乎只能将任务一个接一个地排队,而不是通过引用一个公共队列。我不想管理获取最新任务并附加到它的复杂性。
线程池不保证顺序并且会并行执行工作项。 (这很棒,但不是我需要的)
是否有任何内置类可以处理我没有想到的?
编辑: 我们需要能够在以后将任务添加到队列中。场景是当用户单击按钮时,我们希望向设备发送命令(例如打开或关闭灯泡)。这些命令需要 5 秒来处理,我们希望用户能够多次单击并将请求排队。我们不知道会有多少任务排队,也不知道任务是什么。
【问题讨论】:
-
一个BackgoundWorker和一个阻塞集合?
-
我不完全确定我是否理解:为什么不使用 ConcurrentQueue
单个线程(或可能多个)将只是 myQueue.TryDequeue().Invoke() -
有没有办法自动执行插入到阻塞集合中的最新任务?我可以推出自己的排队/出队/执行机制,但我真的不想重新发明轮子,而且这似乎很常见,以至于已经存在解决方案。
-
IIRC,你可以让 BlockingCollection 表现得像一个堆栈而不是一个队列。
标签: c# .net multithreading