3

我有一个 Web 应用程序,在后面的代码中有一个长时间运行(资源密集型)进程,最终输出是一个 pdf 文件(图像到 pdf 转换工具)

它运行良好..由于我在专用服务器上,所以现在就资源而言根本不是问题。

但是,我想知道如果一次处理的用户超过 20 个,系统会达到其资源限制。

我在网上看到了用户输入他们的电子邮件的服务,我想,这些过程在后台排队,结果用 1st in 1st out 方法通过电子邮件发送。

有人可以告诉我如何使用 C# 在 asp.net 应用程序中实现这种逻辑吗?

4

4 回答 4

5

这样的系统将包括在服务器上运行的 Windows 服务。asp.net 页面所做的唯一事情就是向数据库提交请求(带有相关数据)。Windows 服务然后监视此表并处理所有新请求。

于 2010-05-12T13:16:40.000 回答
0

您想限制并发请求的数量。您可以创建一个单独的应用程序来处理转换过程。Windows 服务或定期运行的计划任务。

  1. 将请求记录到队列、数据库表或MSMQ。您需要将其记录到某个队列中,以防程序发生问题。由于您将异步处理进程,因此用户永远不会知道是否出了问题,除了永远不会收到文件。这样,如果发生某些事情,您可以重新启动该过程并继续处理。
  2. 让外部应用程序监控队列并一次处理一个请求。
  3. 当该过程完成时,通知用户该过程已完成并且可以在网站上下载它,或者只是将 pdf 通过电子邮件发送给用户。

让外部程序处理转换的好处在于,您可以在多台机器上加载程序以更快地处理请求,并且它/它们不必减慢用于处理网站的 Web/应用程序服务器的速度。

于 2010-05-12T13:19:24.037 回答
0

正如克劳斯正确指出的那样,我们必须使用 Windows 服务来实现它
附录到他的答案:
(i)将长时间运行的进程拆分为多个任务
(ii)对于每个任务,创建一个单独的控制台应用程序并使用 applicationId 标识每个应用程序。

enum ApplicationId:byte
{
  Router = 1,
  Task1 =  2,
  Task2 =  3,
  Task3 =  4,
  Task4 =  5,
  Email = 6
}

(iii) 调用一个应用程序作为路由器。它将事务从一个应用程序转移到另一个应用程序。
(iv) 现在创建一个包含 transactionId、nextAppId 和任何其他相关字段的表
(v) 完成任务后,更新表中的 nextAppId
(vi) 在 windows 任务调度程序中调度所有应用程序或使用活动批处理服务器(商业)
(vii )最后一个应用程序“电子邮件”向用户发送一封电子邮件,其中包含生成的 pdf 作为附件

希望这个答案!!!!祝你今天过得愉快!!!

于 2014-09-21T08:45:45.643 回答
0

您需要一些工作人员在后台处理您的任务并发送结果。由于@Klaus 的回答,我建议使用Hangfire。我们使用它在我们的 ASP 应用程序中创建后台作业并执行长时间运行的进程(例如:请求图像处理)。

于 2020-10-29T16:32:44.857 回答