2

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

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

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

4

3 回答 3

1

编写将在 ASP.NET 服务器上运行的 Windows 服务。以可以接受和排队作业请求的方式对其进行架构。队列将允许您在 ThreadPool 中创建最佳线程数,以同时执行排队作业的子集。使用 .NET Remoting 或 WCF 将作业提交到 Windows 服务。

于 2013-01-25T20:53:53.217 回答
1

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

于 2013-01-25T20:55:50.170 回答
0

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

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

于 2013-01-25T20:55:52.400 回答