我有一个需要在后台以序列执行的任务或工作项的队列。这些任务将属于“即发即忘”类型,这意味着一旦它们启动,我并不关心它们是否完成,不需要取消或更新状态。如果它们没有完成,用户将能够手动重试或诊断。
目标是能够保留对队列的引用,只需要执行
myQueue.Add( () => DoMyStuff() );
为了向队列添加内容。
System.Threading.Task类似乎只能一个接一个地排队任务,而不是通过引用公共队列。我不想管理获取最新技术并附加到它的复杂性。
Threadpool不保证排序,并且会并行执行工作项。 (这很好,但不是我需要的)
是否有任何内置类可以处理我没想到的内容?
修改 我们需要能够在以后将任务添加到队列中。场景是我们想要在用户点击按钮时向设备发送命令(想想打开或关闭灯泡)。这些命令需要5秒钟来处理,我们希望用户能够多次单击并对请求进行排队。我们不知道将排队多少任务,也不知道任务是什么。
答案 0 :(得分:3)
创建BlockingCollection
,默认情况下,它将使用ConcurrentQueue
作为其内部数据结构。确保具有先决条件的任何任务首先将其先决条件添加到集合中。 BlockingCollection
可以是Task
的集合,一些自定义项表示要调用的方法的参数,要执行Func<>
或Action<>
,或者其他任何内容。就个人而言,我选择Task
或Action
。
然后你只需要有一个线程来遍历集合中的每个项目并同步执行它们。
您可以在队列正常工作时将新项目添加到队列中,并且不会有任何问题。
答案 1 :(得分:1)
您可以创建一个队列对象作为System.Threading.Task的包装器。如果你在底层线程池中将并发执行线程的数量限制为1,我认为你的问题已经解决了。
限制执行任务的数量:System.Threading.Tasks - Limit the number of concurrent Tasks
答案 2 :(得分:-2)
如何同时启动所有线程并让它们监听作业完成事件。
假设您的线程根据要运行的序列具有id,所有线程可以同时启动,但会一直睡到他们完成上一个作业的作业完成/超时
作业完成/超时事件还将帮助您的监视线程跟踪工作线程