2009-11-17 157 views
4

我们有一个Web应用程序,需要处理大量数据并将消息推送到一系列MSMQueue。此操作可能需要10分钟以上,但我们需要快速回复(由ID组成)。因此,我们实现了一个系统,该系统生成ID并在单独的线程上启动推送过程,然后返回该ID。使用ASP.NET和IIS进行多线程处理

这工作正常,但我们唯一关心的是当IIS重新启动。我们已经完成了一些测试,即使我们的线程没有完成排队消息,IISRESET也会终止工作线程。理想情况下,我们希望以一种方式重新启动IIS,在这种方式下,我们的线程将继续运行直至完成。

将/ NOFORCE开关传递给IISRESET似乎没有效果。

有没有人知道一种方法,我们可以确保IISRESET等待我们的工作线程在重新启动IIS之前完成其处理。

感谢,

史蒂夫

+4

有什么办法可以将这个过程卸载到另一台服务器上吗?我会尽量避免使用我的网络服务器进行密集处理。 – 2009-11-17 17:27:32

+0

Steve_ - 我更新了有关如何将数据传递给Windows服务的答案。 – Kev 2009-11-18 11:41:37

回答

7

IIS是不是真的,你应该执行长时间运行的任务,比如这个地方。我们需要在Web服务器上启动长时间运行的维护任务,因此我们有非常相似的要求。这些作业通过Web服务启动,然后交给Windows服务。只要Windows服务仍然存在,我们就可以查询任务的进度。这意味着我们长期运行的任务可以在IISRESET中生存下来。

IISRESET几乎全是或全无,并且对您在ASP.NET应用程序中运行的.NET线程不敏感。

/NOFORCE交换机在那里告诉IISRESET如果服务在一分钟内没有响应,不要强制重置IIS。 IISRESET不了解您的.NET应用程序,并会终止您的应用程序。

更新:

要回答在史蒂夫的评论的问题:“你怎么建议从IIS将数据传递到Windows服务?”。要做的是在Windows服务中托管.NET Remoting或WCF应用程序,并使用命名管道传递数据/消息(仅在需要机器内部调用时)。

+0

完全同意这正是我们如何做 – zebrabox 2009-11-17 18:00:46

+0

+1。另外,您可能会考虑从MSMQ切换到Service Broker;这样做有很多优点。 – RickNZ 2009-11-18 03:48:36

+0

谢谢。使用单独的服务是我们考虑的事情。你如何建议将数据从IIS传递给Windows服务?我们考虑将它写入文件,但我们需要尽快完成。 – 2009-11-18 11:00:18

0

我会建议,如果你不需要从我接受它的线程的响应,你不会,你排队它在你的数据库,然后创建一个服务来处理队列。重新请求时,创建您的唯一密钥并将其传递给数据库,然后由服务接收。该服务可以处理数据,而无需担心线程被中止,然后您还可以使用服务更好地监控流量/负载。

我们有一个转换机制,它的工作原理类似,它使得这种东西在长期运行中更加简单。

如果您确实需要报告数据,那么您只需等待完成的报告或数据保存到数据库,然后asp.net应用就可以接管其余的数据。