后台线程/进程

本文关键字:进程 线程 后台 | 更新日期: 2023-09-27 17:56:16

>我有一个允许用户上传文件的应用程序。上传完成后,必须在服务器上完成许多处理步骤(解压缩,存储,验证等),因此当一切完成后,稍后将通过电子邮件通知用户。

我见过许多示例,其中来自System.ComponentModel的BackGroundWorker 用于允许在另一个线程中完成异步工作。但是,它们似乎会导致用户最终获得响应。在我们的例子中,不需要 Web 响应 - 代码最多可能需要 30 分钟才能完成。

有没有另一种方法可以启动一个完全独立的线程/进程,即使在用户完全关闭其会话后也会继续运行?

后台线程/进程

如果不需要立即响应,则需要卸载到其他进程来完成繁重的工作。 我会将其转储到数据库,文件夹或帖子中到消息队列中。 工作进程(Windows Services?)将处理文件,从数据库、文件系统或队列中读取。 工作完成后,如果工作进程需要知道何时完成,它可以调用 ASP 应用(Webhook 样式)。 只是一个建议。

编写将在 ASP.NET 服务器上运行的 Windows 服务。 以可以接受和排队作业请求的方式构建它。 队列将允许您在线程池中创建最佳数量的线程,以便并发执行排队作业的子集。 使用 .NET 远程处理或 WCF 将作业提交到 Windows 服务。

如果处理可能需要长达 30 分钟的时间,我建议跳过 Web 工作进程中的后台线程,改用 Windows 服务之类的东西,或者使用 Windows 计划程序按计划运行控制台应用程序。

上传文件后,您可以将其添加到某种队列中(在数据库中,或者如果您喜欢冒险,可以使用像 RabbitMQ 这样的消息队列系统)。 然后,您的 Web 请求可以立即返回,并让用户知道正在处理该文件,后台服务将从队列中选取该项目并继续处理,并在完成后通过电子邮件向用户发送。