1

我有一个任务或工作项队列,需要在后台按顺序执行。这些任务将属于“即发即弃”类型,这意味着一旦它们开始,我真的不在乎它们是否完成,不需要取消或状态更新。如果他们没有完成,用户将能够重试或手动诊断。

目标是能够保持对队列的引用并且只需要做

myQueue.Add( () => DoMyStuff() );

为了向队列中添加一些东西。

System.Threading.Task 类似乎只能一个接一个地对任务进行排队,而不是通过引用一个公共队列。我不想管理获取最新任务并附加到它的复杂性。

线程池不保证顺序并且将并行执行工作项。(这很棒,但不是我需要的)

是否有任何内置类可以处理我没有想到的?

编辑: 我们需要能够在以后将任务添加到队列中。场景是当用户单击按钮时,我们希望向设备发送命令(例如打开或关闭灯泡)。这些命令需要 5 秒来处理,我们希望用户能够多次单击并将请求排队。我们不知道有多少任务将排队,也不知道任务是什么。

4

3 回答 3

3

创建 a BlockingCollection,默认情况下它将使用 aConcurrentQueue作为其内部数据结构。确保任何具有先决条件的任务首先将其先决条件添加到集合中。BlockingCollection可以是 s 的集合,Task一些自定义项表示要调用的方法的参数,Func<>或者Action<>要执行的方法,或其他任何东西。就我个人而言,我会选择TaskAction

然后你只需要一个线程来遍历集合中的每个项目并同步执行它们。

您可以在队列工作时将新项目添加到队列中,并且不会有任何问题。

于 2012-04-23T20:07:50.353 回答
1

您可以创建一个队列对象作为 System.Threading.Task 的包装器。如果您在底层线程池中将并发执行的线程数限制为 1,我认为您的问题已经解决。

限制执行任务的数量:System.Threading.Tasks - 限制并发任务的数量

于 2012-04-23T19:53:56.400 回答
-2

如何同时启动所有线程并让它们监听作业完成事件。

假设您的线程根据运行顺序具有 id,所有线程可以同时启动,但会休眠直到它们完成前一个作业的作业/超时

作业完成/超时事件还将帮助您的监控线程跟踪工作线程

于 2012-04-23T20:00:56.183 回答