C# 如何实现显式的、可检查的任务队列?

C# 如何实现显式的、可检查的任务队列?,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,这个问题讨论了由于第三方物流,传统排队模式在现代C#中是如何过时的: 公认的答案提出了似乎是无状态的解决方案。这是非常优雅的,但是,也许我是恐龙或误解了答案。。。如果要暂停队列或保存其状态,该怎么办?如果将任务排队时,行为应取决于队列的状态,或者排队的任务可能具有不同的优先级,该怎么办 在任务范例中,如何有效地实现一个有序的任务队列?它实际上有一个显式的队列对象,您可以检查甚至与之交互?支持排队任务的单/并行处理是一个好处,但就我的目的而言,如果出现问题,单并发是可以接受的。我不是一秒钟处理数百

这个问题讨论了由于第三方物流,传统排队模式在现代C#中是如何过时的:

公认的答案提出了似乎是无状态的解决方案。这是非常优雅的,但是,也许我是恐龙或误解了答案。。。如果要暂停队列或保存其状态,该怎么办?如果将任务排队时,行为应取决于队列的状态,或者排队的任务可能具有不同的优先级,该怎么办

任务
范例中,如何有效地实现一个有序的任务队列?它实际上有一个显式的
队列
对象,您可以检查甚至与之交互?支持排队任务的单/并行处理是一个好处,但就我的目的而言,如果出现问题,单并发是可以接受的。我不是一秒钟处理数百万个任务,事实上我的任务通常都很大/很慢


我很高兴地接受,根据需求,存在具有不同可伸缩性的解决方案,我们通常可以在可伸缩性和编码工作量/复杂性之间进行权衡。

您所描述的内容基本上与
频道
API类似。这已经存在:

  • 努吉:
  • msdn:
  • 其他:

它不是一个明确的
队列
,而是一个队列。支持有界与无界、单个与多个读写器。

对于在当今的多处理器系统上运行大量短期任务,单个队列本身并不是一个有效的解决方案,这就是为什么框架的默认任务调度器具有多个偷取工作的队列。当然,你完全可以用
ConcurrentQueue
作为支持机制,用持久性机制、优先级机制和类似
CancellationToken
的合作暂停结构来编写自己的概念实现,但我认为这超出了回答的范围。的文档列出了一个调度器的示例实现,它执行与默认实现不同的操作,以及许多关于默认实现的背景信息。编写自己的完全定制的调度程序,很好地处理
任务
s可能会遇到外部代码的问题,因为很难强制所有东西都使用您的调度程序,而不是默认的调度程序。@Jeroenmoster我的意思是,如果更传统的方法是符合我需求的逻辑解决方案,我很高兴,一些保证,这实际上是好的,事实上,因为我到处看,我被告知我必须使一切超级平行。我会问,为什么假设我的任务数量大而复杂度小?我应该在问题中澄清这一点吗?如果您既没有与实际代码中的
async
/
wait
Task
结为夫妻,那么只执行和排队
操作的自定义代码在概念上可能更简单。毕竟,没有人强迫你使用
任务
。毫无疑问,这个建议是为了让人们远离幼稚,每个任务代码有一个
线程
,带有显式同步和伴随的bug。使用
async
/
await
显然优于此,适用于大多数用例,而将
Task
与完全定制的调度一起使用本身并没有错,只是可能比必要的更笨拙。不管文档怎么说,从来没有一个灵丹妙药。OP希望与队列交互,这意味着(我想)他希望能够从队列中任意添加/删除项目、检查队列大小、执行等。这些功能不受类的支持。