2011-08-22 75 views
1

我在我的MVC应用程序(C#)中有一个很长的运行过程。 其许多报告的建筑数据。.Net MVC线程长时间运行过程

某些客户可能需要几分钟或更长的时间来计算。在单独的线程中运行进程是最好的选择? 是否有另一种方式允许进程运行,同时允许用户仍然使用网站的其余部分?

如果线程是最好的解决方案,任何好的网站或stackoverflow线程来看看如何做到这一点?

回答

3

当我遇到类似这样的情况时,我通常会构建一个服务来异步处理请求,并返回一个可用于检查其在数据库中的状态的句柄。恕我直言,将其作为Web应用程序中的一个线程拆分,好像你会试图将一个方形钉子推入圆孔。

+0

我确实有一个statustracker已被使用,并可以重复使用。没有被用于像这些报告计算一样运行得非常长的事情。 –

+0

我想知道您使用的服务。这仅仅是一种在应用程序和/或II之外运行的服务吗?或者它是一个Web服务?你是否在使用命令模式(如下面的短文)。这就是编码丢失的地方,让它自行运行,而不必等待控制器/操作回传。 –

+0

目前正在寻找AsyncController。许多其他网站一直指出这是长期运行的服务。已将它用于状态跟踪器。试图找出如何将其用于长时间运行的服务。 –

1

我已经使用了两种方法来解决这个问题。如果工作保证不会太长时间,我已经启动了一个线程来完成工作并立即返回给用户。当我们无法做出保证时,我们使用一个队列(我们恰好使用MSMQ)来执行长时间运行的任务。此处理是在除IIS之外的其他服务器上完成的。这样做的好处是我们建立了一个等待并重试失败机制。所以除了处理长时间运行的任务之外,我们还用它来处理任何可能会失败的事情,而这种方式在我们的MVC应用程序中不方便处理。这方面的主要例子是发送电子邮件。而不是在MVC应用程序中这样做,我们只会在队列中抛出电子邮件任务。我们对放置在队列中的任务对象使用了命令模式。一旦我们有了这个机制,我们就停止使用从我们的MVC代码中产生线程的技术。

+0

如果应用程序域回收(例如,如果web.config已更新,或者默认情况下每隔29小时发生在IIS中),则可能会在执行过程中断开您的线程。如果你能够容忍你的线程突然停下来,只有使用这种方法。 –

+0

@EricJ。 - 如果通过“这种方法”,你的意思是在IIS中运行另一个线程,我同意。这就是为什么我们使用我描述的MSMQ方法。处理队列并执行工作的Windows服务不仅写入失败/重试,而且优雅地处理服务器关闭,因此不会在裂缝之间滑动。 – hatchet