Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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_Encoding_Queue - Fatal编程技术网

设计:队列管理问题(C#)

设计:队列管理问题(C#),c#,.net,encoding,queue,C#,.net,Encoding,Queue,我想构建一个windows服务,该服务将使用远程编码服务(如encoding.com、zencoder等)上载视频文件进行编码,在编码过程完成后下载并处理它们 为了做到这一点,我考虑使用不同的队列,一个用于处理当前正在等待的文件,一个用于上载的文件,一个用于等待编码完成的文件,还有一个用于下载它们。每个队列都有一个限制,例如在特定时间只能上载5个文件进行编码。队列必须是可见的,并且能够从崩溃中恢复-目前我们通过将队列写入SQL表并管理单独表中的项目数来实现这一点 我还希望队列在后台运行,彼此独立

我想构建一个windows服务,该服务将使用远程编码服务(如encoding.com、zencoder等)上载视频文件进行编码,在编码过程完成后下载并处理它们

为了做到这一点,我考虑使用不同的队列,一个用于处理当前正在等待的文件,一个用于上载的文件,一个用于等待编码完成的文件,还有一个用于下载它们。每个队列都有一个限制,例如在特定时间只能上载5个文件进行编码。队列必须是可见的,并且能够从崩溃中恢复-目前我们通过将队列写入SQL表并管理单独表中的项目数来实现这一点

我还希望队列在后台运行,彼此独立,但能够随着进程的进行将文件从一个队列传输到另一个队列

我最大的疑问是如何构建和管理队列,而不是限制每个队列中的项目数量

我不确定什么是正确的方法,非常感谢您的帮助。

谢谢

有多种方法可以实现这一点,这取决于哪种方法在可靠性和恢复力/开发成本/维护成本方面适合您的情况。您需要回答这样一个问题:如果服务器崩溃,继续您正在做的事情是否重要

队列可以在MSMQ、SQL Server中实现,也可以在代码和内存中的所有队列中实现。对于工作流,您可以使用Windows工作流基础,或者自己实现,这可能更容易,但更改将更加困难。
因此,如果您再给我一些提示,我应该能够更好地帮助您。

您可能不需要将工作划分为单独的队列,只要它们在逻辑上以某种方式分开(标记为不同的“工作类型”或类似)

在我看来,挑战在于根据作业类型,从队列中拾取和处理的作业数量不超过给定的有限数量。前段时间我遇到了一个类似的问题,导致了一个,以及随后的一个,这两个问题可能会给你一些想法


简言之,我的解决方案是保留一个“代币”列表。当我想要执行有某种限制的工作时,我首先选择一个令牌。如果没有代币可用,我将需要等待一个代币可用。然后,您可以使用任何适合的排队机制来处理队列。

谢谢。是的,如果服务器崩溃,从我离开的同一地点接机是至关重要的。我很乐意提供更多信息,只要让我知道什么是有帮助的。如果您需要它是故障安全的,我会将它存储在SQL Server中,如果我有能力的话,因为它更易于使用和备份。如果没有,我将使用MSMQ,它是随Windows免费提供的。对于工作流,我会在代码中使用简单的状态机。谢谢,这很有帮助,但我的问题是试图更多地针对单独队列的管理。你的博客文章很有用。谢谢我同意弗雷德里克的观点。如果创建4个队列,并为每个队列(或相似数量的线程)分配一个线程,则可能是一个慢速队列(负责长时间运行的进程的队列)会减慢整个进程,因为该队列很忙,而其他队列中的线程则处于空闲状态,什么也不做。在任何情况下,微调这些线程数都是困难的。事实证明,这篇博客文章非常有用。谢谢!