2011-05-22 71 views
5

我正在开发一个web asp.net应用程序。应用程序的一个特点是用户能够排队一些长时间运行的操作,然后点击运行队列将被处理。管理Web应用程序中长时间运行的进程的策略?

我不希望用户不得不坐下来等待所有的操作来完成或确实保持浏览器/应用程序的打开状态。但是,如果他们留在或返回到页面,我希望他们能够看到每项工作的状态,即正在等待,正在进行中,已完成或失败。

我自然在寻找最强大,最可靠和最可扩展的解决方案,因为随时可能有大量的作业在队列中。

从我的研究中已经有人建议,asp.net可以调用windows服务?这可能是托管一个WCF Web服务。

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

回答

2

一个好的方法是有一个执行预定作业的Windows服务。您可以使用像Quartz.NET这样的库,它具有各种排程功能。如果您不需要特定的时间安排,则可以让Windows服务充当工作进程并简单地使用作业。除此之外,您还需要促进Web应用程序与执行排队任务的服务之间的通信。您可以使用一些技术来实现这一点,比如在数据库中使用表或者使用其他类型的进程间通信技术(远程处理,命名管道,套接字,消息队列等)。

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

+0

就像你说的,我没有严格地安排任何事情,但Quartz.NET的确看起来很有趣。理想情况下,我喜欢打电话到服务中,并在我将作业添加到队列后告诉它运行。如果我每分钟都轮询一次,我猜这里没有太多... – bigtv 2011-05-23 10:19:04

+0

是的,您也可以使用MSMQ或简单的套接字来表示新服务可用的服务。这里有一些IPC的更多信息:http://stackoverflow.com/questions/50153/interprocess-communication-for-windows-in-c-net-2-0 – 2011-05-23 10:29:12

+0

发现这篇文章是相当不错的 - http:// msdn .microsoft.com/EN-US /杂志/ cc163482.aspx。 – bigtv 2011-05-23 11:40:28

5

还检查了MSMQ,

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

基本上Web应用程序会将 “的工作组”, “工作” 或成一个队列。

该服务不断运行,使下一个“工作”或“工作组”出列并开始与他们进行业务往来。

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

享受。

+0

看着MSMQ它确实看起来非常优雅,但是在我的场景中,我不确定我能看到使用数据库表并看着它而不是队列的好处,我错过了什么吗? – bigtv 2011-05-23 10:12:27

+1

这取决于您的情况,它可能是不必要的,但如果您的系统需要增长,整合这样的队列可能会证明更可靠和可扩展。为了保持一个体面的“状态信息”,你可能会不管涉及到数据库。我只会提醒你,如果你走的是后台线程,你可以在负载平衡的环境下工作。 – mikey 2011-05-23 18:54:47

0

我有类似的问题。我有一个web应用程序可以启动一个长时间运行的进程。我想更新用户界面,以便用户看到发生了什么。我有一个类获取一些属性设置,然后启动该过程。这是我的方法。

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

就是这样。

相关问题