我有一个 Web 应用程序,在后面的代码中有一个长时间运行(资源密集型)进程,最终输出是一个 pdf 文件(图像到 pdf 转换工具)
它运行良好..由于我在专用服务器上,所以现在就资源而言根本不是问题。
但是,我想知道如果一次处理的用户超过 20 个,系统会达到其资源限制。
我在网上看到了用户输入他们的电子邮件的服务,我想,这些过程在后台排队,结果用 1st in 1st out 方法通过电子邮件发送。
有人可以告诉我如何使用 C# 在 asp.net 应用程序中实现这种逻辑吗?
我有一个 Web 应用程序,在后面的代码中有一个长时间运行(资源密集型)进程,最终输出是一个 pdf 文件(图像到 pdf 转换工具)
它运行良好..由于我在专用服务器上,所以现在就资源而言根本不是问题。
但是,我想知道如果一次处理的用户超过 20 个,系统会达到其资源限制。
我在网上看到了用户输入他们的电子邮件的服务,我想,这些过程在后台排队,结果用 1st in 1st out 方法通过电子邮件发送。
有人可以告诉我如何使用 C# 在 asp.net 应用程序中实现这种逻辑吗?
这样的系统将包括在服务器上运行的 Windows 服务。asp.net 页面所做的唯一事情就是向数据库提交请求(带有相关数据)。Windows 服务然后监视此表并处理所有新请求。
您想限制并发请求的数量。您可以创建一个单独的应用程序来处理转换过程。Windows 服务或定期运行的计划任务。
让外部程序处理转换的好处在于,您可以在多台机器上加载程序以更快地处理请求,并且它/它们不必减慢用于处理网站的 Web/应用程序服务器的速度。
正如克劳斯正确指出的那样,我们必须使用 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 作为附件
希望这个答案!!!!祝你今天过得愉快!!!
您需要一些工作人员在后台处理您的任务并发送结果。由于@Klaus 的回答,我建议使用Hangfire。我们使用它在我们的 ASP 应用程序中创建后台作业并执行长时间运行的进程(例如:请求图像处理)。