我的过程如下:我应该如何从数据库表中实现多线程队列?
- 用户登录到Web应用程序,这降低了进入UserQueue表
- Windows服务调查此表每x秒和处理每个项目
- 一旦处理项目从UserQueue表
这一切工作很好地顺序处理,但我担心的是一个长时间运行的任务可以阻止所有其他用户的队列中删除(这将是Web应用程序的问题)。
我认为.NET中的BlockingCollection可以将内容保存在内存中,然后处理它们,但我无法保证UserQueue表中的行不会多次放入该集合中(由于非唯一BlockingCollection的性质),除非我使用数据库标志(例如BeingProcessed = true)。我不喜欢数据库标志,因为如果我的服务因任何原因被停止,它可能会在表中存在未处理的项目,其中BeingProcessed = true。
有没有更多的标准方法来解决这个问题,我错过了,或者我应该考虑Quartz.net还是类似的?
此答案可能会对您有所帮助:[http://stackoverflow.com/questions/2177880/using-a-database-table-as-a-queue](http://stackoverflow.com/questions/2177880/using -a-database-table-as-a-queue) – 2011-12-30 21:44:23
更标准的方法是使用适当的消息队列(比如msmq)。我认为你的做法被称为贫民窟队列。 – keni 2011-12-30 21:45:36
同上@keni。 [RabbitMQ](http://www.rabbitmq.com/devtools.html#dotnet-dev)特别容易设置和使用。 – TrueWill 2011-12-30 21:59:15