如何排队一些工作,以便按顺序执行

时间:2012-04-23 19:43:12

标签: c# .net multithreading

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

目标是能够保留对队列的引用,只需要执行

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

为了向队列添加内容。

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

Threadpool不保证排序,并且会并行执行工作项。 (这很好,但不是我需要的)

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

限制执行任务的数量:System.Threading.Tasks - Limit the number of concurrent Tasks

答案 2 :(得分:-2)

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

假设您的线程根据要运行的序列具有id,所有线程可以同时启动,但会一直睡到他们完成上一个作业的作业完成/超时

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