Web(asp.net)环境中的长时间运行操作(线程)

rre*_*ejc 10 asp.net asp.net-mvc multithreading long-running-processes

我有一个asp.net(mvc)网站.作为函数的一部分,我将不得不支持一些长时间运行的操作,例如:

从用户启动:用户可以将(xml)文件上传到服务器.在服务器上我需要提取文件,做一些操作(插入数据库)等...这可能需要一分钟到十分钟(甚至更多 - 取决于文件大小).当然我不希望在导入运行时阻止请求,但我想将用户重定向到某个进度页面,在那里他将有机会观察状态,错误甚至取消导入.

此操作不会经常使用,但可能会发生两个用户同时尝试导入数据的情况.并行运行导入会很不错.一开始我想在iis中创建一个新线程(控制器动作)并在新线程中运行导入.但我不确定这是不是一个好主意(在Web服务器上创建工作线程).我应该使用Windows服务还是其他任何方法?

从系统启动: - 我将不得不定期使用新数据更新lucene索引. - 我将不得不发送大量电子邮件(将来).

我应该将其作为网站中的工作实现并通过Quartz.net运行工作,还是应该创建Windows服务?

在运行网站"工作"时,最佳做法是什么?

谢谢!

And*_*rko 6

我会为长时间运行的任务实现独立的Windows服务.Web应用程序通过队列方法将长时间运行的任务委托给此服务.由您决定如何组织任务队列.排队任务是否具有优先级,最大执行时间与否.队列可以作为DBMS中的普通表实现,其中包含作业执行状态信息属性(非常简单的方法).

如此常见的情况可能如下所示:

  • 客户端将所有必需的信息发送到Web服务器

  • Web服务器将任务委托给服务并通知客户端 - 任务已成功排队(任务ID也发送到客户端)

  • 外部服务启动任务处理,更新进度信息.

  • 客户端开始轮询Web服务器,其中包含有关作业(具有先前收到的ID)状态和进度的短执行请求.

您可以选择不同的技术(Windows服务+ DB/WCF服务)和不同的通信方法(轮询,推送,回调),但我建议将长时间运行的任务委托给外部服务(不在Web应用程序中执行).

执行长时间运行的任务会带来每个请求的线程模型(以多线程编程术语表示).此模型具有较差的可伸缩性和线程池最大线程数限制.虽然这不是你的情况:)