Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将一定数量的工作排队,以便它们按顺序执行_C#_.net_Multithreading - Fatal编程技术网

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
,我都会在里面死一点。这不是对你的评论,只是一般的评论。为什么让那条可怜的线坐在那里什么也不做?几乎总是有更好的设计。