2011-05-23 61 views
2

上下文:我设置了一个图片上传网站。每次用户上传照片时,我都需要对这些上传进行操作。ASP.NET MVC中的后台线程'job-queue'

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

我有点对线程解决方案“设置”,而不是一个服务实例,因为它不可能为我设置web服务器上的服务。我已经阅读了一些关于消息队列和后台线程的内容,但是我真的需要的是关于如何继续的一些实用指针。

另外 - 有什么我应该知道的事情吗?在我头顶,我正在考虑线程的数量,如果线程太多,可能会遇到IIS或服务器的问题?这就是为什么我认为它应该是每个用户的单个后台线程,而不是每个工作的线程,因为可能会一次上传很多照片。所以每个用户需要一个线程来照顾像时尚这样的“队列”中的工作。我离开基地吗?

+2

我只是会说,如果你想一个IIS进程你要去陷入困境中做异步工作。服务是你应该使用的,因为你的web服务器不是银弹。认为你的Web服务器是后台任务的地方是根本错误的。 – 2011-05-23 06:58:07

+0

我宁愿自己走服务路线,但由于这是不可能的,我不得不考虑线程。 – Dynde 2011-05-23 07:12:32

+0

@Dynde - 你知道线程不是一种选择,它是生活中的一个事实,你会以任何方式进行线程化。请问为什么这是不可能的?为什么你不能在Web应用程序中使用Windows服务? – 2011-05-23 07:28:05

回答

1

,你喜欢,你可以运行许多线程,但你会碰到花更多的时间在上下文切换,实际的嘎吱嘎吱的风险。如果您需要良好的CPU性能,则每个CPU内核应该使用不超过1个线程。 PLINQ的东西有这个确切的策略。如果您告诉PLINQ运行查询,它将并行执行与您的系统上可用的CPU内核数量相等的值。

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

即可以使用SQL Server数据库同步使用数据库FIFO队列工作跨多台计算机(这仅仅是你从工作拉一个简单的表格)。它可以很好地扩展,并且更加强大,因为如果崩溃或超时,工作可以恢复。

你应该阅读这question我上发布有关此而回。 Remus Rusanu在该主题上发布了一些关于使用数据库编排工作负载的intresting链接。