C# 如何将一定数量的工作排队,以便它们按顺序执行
我有一个需要在后台按顺序执行的任务或工作项队列。这些任务将是“开火并忘记”类型,这意味着一旦开始,我并不真正关心它们是否完成,不需要取消或状态更新。如果未完成,用户将能够重试或手动诊断 目标是能够保留对队列的引用,并且只需要C# 如何将一定数量的工作排队,以便它们按顺序执行,c#,.net,multithreading,C#,.net,Multithreading,我有一个需要在后台按顺序执行的任务或工作项队列。这些任务将是“开火并忘记”类型,这意味着一旦开始,我并不真正关心它们是否完成,不需要取消或状态更新。如果未完成,用户将能够重试或手动诊断 目标是能够保留对队列的引用,并且只需要 myQueue.Add( () => DoMyStuff() ); 以便向队列中添加内容 System.Threading.Task类似乎只能一个接一个地对任务进行排队,而不是通过引用公共队列。我不想管理获取最新TAK的复杂性并附加到它 线程池不保证排序,将并行执行
myQueue.Add( () => DoMyStuff() );
以便向队列中添加内容
System.Threading.Task类似乎只能一个接一个地对任务进行排队,而不是通过引用公共队列。我不想管理获取最新TAK的复杂性并附加到它
线程池不保证排序,将并行执行工作项。(这很好,但不是我需要的)
是否有任何内置类可以处理我没有想到的问题
编辑:
我们需要能够在以后将任务添加到队列中。这种情况下,当用户点击按钮时,我们希望向设备发送命令(比如打开或关闭灯泡)。处理这些命令需要5秒钟,我们希望用户能够多次单击并将请求排队。我们不知道有多少任务将预先排队,也不知道任务是什么。您可以创建一个队列对象作为System.Threading.Task的包装器。如果将底层线程池中并发执行的线程数限制为1,我认为您的问题就解决了
限制执行任务的数量:如何同时启动所有线程并让它们侦听作业完成事件 假设您的线程根据要运行的顺序具有id,则所有线程都可以同时启动,但会一直休眠,直到完成作业/前一个作业超时
作业完成/超时事件还将帮助监视线程跟踪工作线程创建一个
BlockingCollection
,默认情况下,它将使用ConcurrentQueue
作为其内部数据结构。确保任何具有先决条件的任务都先将其先决条件添加到集合中。BlockingCollection
可以是Task
s的集合,一些表示要调用的方法参数的自定义项,要执行的Func
或Action
等。就个人而言,我会选择任务
或行动
然后您只需要有一个线程来遍历集合中的每个项并同步执行它们
您可以在队列工作时将新项目添加到队列中,它不会有任何问题。BackgoundWorker和阻止集合?我不完全明白:为什么不使用ConcurrentQueue,一个线程(或几个线程)只会导致myQueue.TryDequeue().Invoke()附件可能会引起兴趣:是否有一种方法可以自动执行插入到阻止集合中的最新任务?我可以使用自己的排队/出列/执行机制,但我真的不想重新发明轮盘,这似乎是一种非常常见的情况,以至于已经存在一个解决方案。IIRC,您可以使BlockingCollection的行为像一个堆栈而不是一个队列。如果队列中有100万个任务,该怎么办?在任何情况下,让线程像这样睡眠直到其他线程完成都不是一个好主意。诚然,使用Martin Jameshone提到的后台工作程序和阻塞集合会更有效,每次我在《人民的代码》中看到
sleep
,我都会在里面死一点。这不是对你的评论,只是一般的评论。为什么让那条可怜的线坐在那里什么也不做?几乎总是有更好的设计。