我有一个允许用户上传文件的应用程序。上传完成后,必须在服务器上完成许多处理步骤(解压缩,存储,验证等等),这样一旦完成所有事情,用户将在稍后通过电子邮件通知。
我已经看到了许多示例,其中使用System.ComponentModel中的BackGroundWorker来允许在另一个线程中完成异步工作。但是,似乎它们会导致用户最终得到回复。在我们的案例中,不需要Web响应 - 代码最多可能需要30分钟才能完成。
是否还有另一种方法可以启动一个完全独立的线程/进程,即使在用户完全关闭会话之后也会继续运行?
答案 0 :(得分:1)
编写将在ASP.NET服务器上运行的Windows服务。以它可以接受和排队作业请求的方式构建它。该队列将允许您在ThreadPool中创建最佳线程数,以便同时执行排队作业的子集。使用.NET Remoting或WCF将作业提交到Windows服务。
答案 1 :(得分:1)
如果不需要立即响应,您需要卸载到其他一些进程来完成繁重的工作。我会将它转储到数据库,文件夹或发布到消息队列。工作进程(Windows Services?)将处理文件,从db,文件系统或队列中读取。完成工作后,如果需要知道何时完成,您的工作进程可以调用您的ASP应用程序(webhook样式)。只是一个建议。
答案 2 :(得分:0)
如果处理最多需要30分钟,我建议您使用Web工作进程中的后台线程并使用类似Windows服务的方法,或者使用Windows调度程序按计划运行控制台应用程序。 / p>
上传文件后,您可以将其添加到某种类型的队列中(无论是在数据库中,还是使用消息排队系统,如RabbitMQ,如果您有冒险精神)。然后,您的Web请求可以立即返回并让用户知道正在处理该文件,后台服务将从队列中挑选该项目并继续处理,并在用户完成时通过电子邮件发送。