【问题标题】:BackgroundWorker From ASP.Net Application来自 ASP.Net 应用程序的 BackgroundWorker
【发布时间】:2009-11-30 18:20:50
【问题描述】:

我们有一个 ASP.Net 应用程序,它让管理员可以处理大量记录并对其执行操作。例如,我们有一个“波兰数据”任务,管理员可以执行该任务来清理记录的数据(例如重新格式化电话号码、社会保险号码等)。当对少量记录执行时,任务完成相对较快.但是,当用户对较大的记录集执行任务时,该任务可能需要几分钟或更长时间才能完成。因此,我们希望使用某种异步模式来实现这些类型的任务。例如,我们希望能够启动任务,然后使用 AJAX 轮询来提供进度条和状态信息。

我一直在研究使用 BackgroundWorker 类,但我在网上阅读了一些让我停下来的东西。我很想就此获得一些额外的建议。

例如,我知道 BackgroundWorker 实际上会使用当前应用程序的线程池。就我而言,该应用程序是一个 ASP.Net 网站。我已经读过这可能是一个问题,因为当应用程序回收时,后台工作人员将被终止。我上面提到的一些工作可能需要 3 分钟,但其他工作可能需要几个小时。

此外,我们可能有数百名管理员在白天都在执行类似的操作。 ASP.Net 应用程序线程池是否能够有效地处理所有这些后台作业,同时仍执行正常的请求处理?

所以,我正在尝试确定使用 BackgroundWorker 类和方法是否适合我们的需求。我应该寻找替代方法吗?

感谢和抱歉这么长的帖子!

凯文

【问题讨论】:

    标签: asp.net multithreading backgroundworker


    【解决方案1】:

    在您的情况下,听起来您将要寻找的解决方案实际上是多方面的(而不是一个简单的完成项目)。

    既然你说某些进程可以持续几个小时,那绝对不是 ASP.NET 拥有的。这应该在 Windows 服务中运行并使用本机 Windows 线程进行管理。

    您需要在服务中实现某种类型的工作队列以及与队列通信的方式。一种方法是为您的服务将管理的所有操作公开 WCF 服务。另一种方法是让服务轮询数据库表并从表中获取工作。

    为了能够表达进程的状态,您将希望 ASP.NET 应用程序能够对 processID 进行一些引用,例如 WCF 服务返回一个 guid 标识符。然后你有一个方法,当你给它 processID 时,它会返回进程的状态。然后,您可以使用 AJAX 实现该服务调用的轮询并显示您希望的任何类型的模式。

    要记住的另一件事是,您需要设计您的流程以了解它在哪里以及完成时它将在哪里,以便它可以跟踪它所处的状态。例如,BatchJobA 正在运行并且将有 1000要处理的记录。该服务需要知道它在什么记录上或当前的竞争百分比是多少,才能将信息返回到 UI。对于需要很长时间才能执行的 sql 查询,除非您对临时表进行大量预处理和后处理,否则您可以在其中读取临时表的状态,否则很难准确判断它的位置。了解它在哪里。

    【讨论】:

      【解决方案2】:

      根据您所说的,我认为 BackgroundWorker 不是一个好的选择。

      此外,将此功能保留为主应用程序的一部分可能会有问题,特别是因为您不希望在主应用程序回收时中断提交的处理。您可以使用异步处理,但它仍将是主应用程序 AppDomain 的一部分 - 如果应用程序回收,所有这些都会消失。

      我建议构建一个单独的应用程序来实现此功能。在类似的情况下,我将后台处理分离到 Windows 服务中,并在其中托管了一个 Web 服务作为通信方式

      【讨论】:

        【解决方案3】:

        您可能会考虑稍微不同的方法。

        例如,有一个命令和控制表,您可以在其中发送诸如“重新格式化电话号码”之类的命令。

        然后让 Windows 服务监视该表。每当出现记录时,运行命令。

        这消除了对后台线程的任何担忧。此外,您在队列中的内容、操作顺序(包括优先级)等方面具有更大的灵活性。最后,您将获得正在运行或需要运行的明确列表。

        作为一种选择,您可以不使用 Windows 服务,而是使用 SQL 作业每隔一段时间执行一次,以观察您的控制表并执行请求的操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          相关资源
          最近更新 更多