ASP.NET MVC中的后台线程'作业队列'

时间:2011-05-23 06:54:10

标签: c# asp.net-mvc multithreading

背景信息:我设置了照片上传网站。每次用户上传照片时,我都需要对这些上传进行操作。

在SO的其他用户的帮助下,我得出结论,我需要一个接受这些“处理作业”的后台线程,所以我可以快速返回对用户的响应,并让后台线程处理这些后台工作。

我对线程解决方案有点“设置”而不是服务,因为我不可能在网络服务器上设置服务。我已经阅读了有关消息队列和后台线程的一些内容,但我真正需要的是关于我应该如何进行的一些实用指示。

此外 - 有什么我应该注意的事情吗?在我脑海中,我正在考虑线程的数量,如果运行的线程太多,可能会遇到IIS或服务器的问题?这就是为什么我认为它应该是每个用户的单个后台线程,而不是每个作业的一个线程,因为可能会同时上传许多照片。因此,每个用户使用一个线程来处理像“时尚”这样的“队列”中的作业。我离开基地了吗?

1 个答案:

答案 0 :(得分:1)

您可以根据需要运行任意数量的线程,但是您将面临花费更多时间进行实际运算的上下文切换的风险。如果您需要良好的CPU性能,每个CPU核心应使用不超过1个线程。 PLINQ的东西有这个确切的策略。如果告诉PLINQ运行查询,它将并行执行,相当于系统上可用的CPU内核数量。

如果你要实现队列,你应该考虑一个FIFO队列,用户将他们的工作放在一堆线程或服务器中从这个队列中拉出工作并完成工作。

即。您可以使用SQL Server数据库使用数据库中的FIFO队列来跨多台计算机同步工作(这只是一个简单的工作表)。它会很好地扩展,并且它也更加健壮,因为如果崩溃或超时,可以恢复工作。

你应该阅读这篇question我之前发布的这篇文章。 Remus Rusanu在该主题上发布了一些有趣的链接,讨论了如何使用数据库来协调工作量。