管理Web应用程序中长时间运行流程的策略?

时间:2011-05-22 12:55:39

标签: c# asp.net sql-server wcf windows-services

我正在开发一个web asp.net应用程序。该应用程序的一个特性是用户能够排队一些长时间运行的操作,然后命中运行队列将被处理。

我不希望用户必须等待所有操作完成或确实打开浏览器/应用程序。但是,如果他们保留或返回页面,我希望他们能够看到每个作业的状态,即等待,进行中,完成或失败。

我自然而然地寻找最强大,最可靠和可扩展的解决方案,因为队列中任何时候都可能有大量的工作。

根据我的研究,有人建议asp.net可以调用windows服务吗?这可能是托管WCF Web服务。

寻找过去可能有类似要求的任何人的建议。

4 个答案:

答案 0 :(得分:5)

同时查看MSMQ,

http://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx

基本上,Web应用程序将“作业”或“作业组”放入队列中。

服务不断运行,使下一个“工作”或“工作组”出局并与他们开展业务。

完成后,服务会将结果放入另一个队列或Web应用程序访问的DB(或其他一些共享资源)中,并显示其状态或结果。

享受。

答案 1 :(得分:2)

通常很好的方法是让Windows服务执行预定作业。您可以使用具有所有类型的日程安排功能的Quartz.NET库。如果您不需要特定的计划,则可以将Windows服务充当工作进程并简单地使用作业。除此之外,您还需要促进Web应用程序与执行排队任务的服务之间的通信。您可以使用许多技术,例如在数据库中使用表或仅使用其他类型的进程间通信技术(远程处理,命名管道,套接字,消息队列等)。

我实际上实现了类似的东西,其中有一个Windows服务执行预定的作业,并且有一个ASP.NET Web应用程序正在提出所有作业请求。 ASP.NET应用程序将一些作业发布到数据库中,稍后将由服务进程使用。

答案 2 :(得分:1)

使用Windows服务是个好主意。虽然,我没有使用它的任何经验,也不知道意外的陷阱 此外,您可能想要查看Fire And Forget模式。 (可以找到更多信息和样本here) 使用多线程可能是另一种选择。有关详细信息,请查看:
http://msdn.microsoft.com/en-us/magazine/cc163587.aspx
http://msdn.microsoft.com/en-us/magazine/cc164128.aspx#S6
http://msdn.microsoft.com/en-us/library/ff647332.aspx

答案 3 :(得分:0)

我有类似的问题。我有一个网络应用程序启动一个长期运行的过程。我想更新UI,以便用户看到正在发生的事情。我有一个类,可以设置一些属性,然后启动该过程。这是我的方法。

1)向我的班级添加一个属性,作业ID 2)当Web用户启动作业时,生成一个新的作业ID并将其分配给上面的属性 3)当我的课程正在运行时,更新数据库中的日志表。根据工作ID更新它 4)在前端,有一些简单的ajax进程检查作业id的状态是否为x秒。

就是这样。

相关问题