【问题标题】:.Net MVC Threading Long running process.Net MVC 线程长时间运行的进程
【发布时间】:2013-03-06 21:30:11
【问题描述】:

我的 MVC 应用程序 (C#) 中有一个长时间运行的进程。 它为许多报告构建数据。

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

如果线程是最好的解决方案,有什么好的网站或 stackoverflow 线程可以看看如何做到这一点?

【问题讨论】:

    标签: asp.net asp.net-mvc multithreading


    【解决方案1】:

    当我遇到类似的情况时,我通常会构建一个服务来异步处理请求,并返回一个句柄,我可以使用该句柄来检查它在数据库中的状态。恕我直言,将其作为 Web 应用程序中的线程拆分似乎您会尝试将方形钉塞入圆孔中。

    【讨论】:

    • 我确实有一个已经在使用的状态跟踪器,并且可以重复使用。不被用于像这些报告计算这样运行时间很长的东西。
    • 我想知道您使用的服务。这只是在应用程序和/或 II 之外运行的服务吗?或者它是一个网络服务?您是否使用命令模式(如下面的斧头)。这就是在编码中迷失的地方,让某些东西自己运行,而不必等待控制器/动作回发。
    • 目前正在寻找 AsyncController。许多其他网站一直指向这一点以获得长期运行的服务。已经将它用于状态跟踪器。试图弄清楚如何将它用于长期运行的服务。
    • 看起来 Windows 服务是要走的路。因为我希望允许用户离开页面,并且 AsyncController 将在完成后返回一个 Completed View。如果我想要一个进度条,这将非常有用。
    【解决方案2】:

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

    【讨论】:

    • 如果应用程序域回收(例如,如果 web.config 更新,或者默认情况下在 IIS 中每 29 小时发生一次),您的线程可能会在执行过程中被拆除。仅当您可以容忍线程突然停止时才使用此方法。
    • @EricJ。 - 如果通过“这种方法”你的意思是在 IIS 中运行另一个线程,我同意。这就是我们使用我描述的 MSMQ 方法的原因。处理队列并完成工作的 Windows 服务被写入不仅会失败/重试,而且会优雅地处理服务器关闭,因此不会有任何漏洞。
    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多