2010-10-14 101 views
0

我必须启动线程才能在后台执行一些长时间运行的任务(即使浏览器已关闭),而无需等待网页按钮单击事件的响应。从ASP.NET启动和停止线程

如果用户希望这样做,我还需要能够稍后停止。

我该怎么做?

是否可以将线程的id存储在数据库中,并在稍后中止?

我需要使异步webservicewcf调用来实现吗?

如果在这种情况下需要的话,我该如何停止长时间运行的任务?

在此先感谢。

回答

2

我建议你的ASP.Net应用程序向数据库表写请求,并用Windows服务处理这些请求。

我会用一个表排队新任务和一个单独的表来管理运行任务。这第二个表可用于报告进度或终止正在运行的任务。完成任务后,您可以将它们移至第三个表格,并附有汇总数据以供日后分析。

该数据库还为您提供了持久性,因此如果服务器崩溃,Windows服务可以提供任务的自动重新启动,而无需用户重新提交它们。

如果你有很多排队的任务,你可以在多个应用程序服务器上产生Windows服务来加快速度,所有这些都是通过数据库控制的。

+0

这就是我几乎决定的,因为涉及各种问题(如负载平衡器等)管理Web服务器上的长时间运行的任务。 Windows服务可以启动多个线程并行执行任务。 Windows服务的唯一问题是它需要每隔一秒钟或几分钟检查一次数据库以检查新的请求,这在非高峰时间效率不高,如果以某种方式事件驱动,比如事件是在用户发出请求并且服务订阅它时发布的,并且只在有新请求时才发挥作用。我需要使用MSMQ吗? – RKP 2010-10-15 09:16:48

+0

你可以尝试MSMQEvent,看看它是否适合你。投票不应该给服务器带来很大的负担,除非你经常敲打它。如果这是个大问题,你可以在非高峰时段的时间间隔后退。但是机器的目的是做事情,所以如果它没有做其他事情,那么一些投票会出现什么问题? – 2010-10-15 13:30:20

+0

感谢您的回复 – RKP 2010-10-15 15:11:24

0

可以使用backgroundworker类:

实例化一个BackgroundWorker,定义一个DoWork的事件处理程序和RunWorkerCompleted事件处理程序。然后使用RunWorkerAsync方法启动该操作。您可以使用CancelAsync方法取消操作。

也许您可以在缓存或应用程序中存储对工作人员的引用(或者在Session中,如果它是用户特定的),以便在需要取消时检索它。