运维开发网

网络(asp.net)环境中的长时间运行(线程)

运维开发网 https://www.qedev.com 2020-05-11 21:05 出处:网络 作者:运维开发网整理
我有一个asp.net(mvc)网站.作为功​​能的一部分,我将不得不支持一些长时间运行的操作,例如: 从用户发起: 用户可以将(xml)文件上传到服务器.在服务器上,我需要提取文件,做一些操作(插入数据库)等…这可能需要一分钟到十分钟(甚至更多 – 取决于文件大小).当然,我不想在导入运行时阻止请求,但是我想将用户重定向到某个进度页面,在这个页面中,他将有机会观看状态,错误甚至取消导入. 此操作
我有一个asp.net(mvc)网站.作为功​​能的一部分,我将不得不支持一些长时间运行的操作,例如:

从用户发起:

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

此操作不会频繁使用,但可能会发生两个用户同时尝试导入数据.并行运行导入将是很好的.一开始我正在考虑在iis(控制器动作)中创建一个新的线程,并在一个新线程中运行导入.但我不知道这是否是一个好主意(在Web服务器上创建工作线程).我应该使用Windows服务还是其他方法?

从系统启动:

– 我必须定期更新lucene索引与新的数据.

– 我将不得不发送大量电子邮件(将来).

我应该在网站上实现这个工作,并通过Quartz.net运行这个工作,还是应该创建一个Windows服务?

关于运行网站“工作”的最佳做法是什么?

谢谢!

我将为长时间运行的任务实现独立的Windows服务. Web应用程序通过队列方式将长时间运行的任务委托给此服务.这取决于你如何组织任务队列.排队任务的优先级,最大执行时间或不.队列可以实现为DBMS中的普通表,其中包含作业执行状态信息属性(相当简单的方法).

所以常见的情况可能如下:

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

> Web服务器将任务委托给服务

并通知客户端 – 任务

成功排队(任务ID也发送到客户端)

>外部服务启动任务处理,

更新进度信息.

>客户端开始轮询Web服务器

关于作业的短执行请求(以前收到的ID)

状况和进展.

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

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

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号