从ASP.NET或预定作业启动长时间运行的后台任务
我有一个相当长时间运行的过程(几分钟),我需要每月大约运行一次 – 但不是在固定的时间表上,而是在用户单击ASP.NET Webforms GUI页面中的Go之后。
由于ASP.NET实际上并不是为处理长时间运行的后台任务而设计的,我的想法是把它放到一个单独的控制台应用程序中。 但是如何根据需要推出?
如果我从ASP.NET页面的代码隐藏中使用Process.Start(....)
会发生什么? 我想避免阻止整个Web UI大约20分钟……而且:即使它没有阻止我的UI,如果ASP.NET应用程序池在它仍处于循环状态时再循环,我的长时间运行任务会发生什么运行?
另一个想法是让一个频繁运行的作业(每2分钟运行一次)检查某种标志(例如存在一些数据库条目),如果需要,该作业将启动长期运行的任务。
但同样的问题:如果我使用Process.Start()
从作业启动我的20分钟任务 – 这会阻止调用者吗?
由于通常每月只运行一次,因此每天五次安排长时间运行的任务似乎有点过分 – 但同时,用户希望在合理的时间内(小于1)获得他的结果安排过程后的小时,如果有可能的话 – 所以我不能真正安排它在晚上运行一次……
首先 – 由于几个原因 – ASP.NET无法解决长期运行的任务/工作/ ……无论如何。
我有很多次这个要求,总是解决/分离它:
工人
服务与
- Quartz.net (用于调度和处理,即使你没有特定的时间戳来执行 – 但是这个框架中的整体处理非常棒)
- 持久的作业存储(处理启动/停止和已完成/已中止/暂停的作业)
- 例如ServiceStack作为两个进程之间的互操作
网站
只需调用worker的一些webservice-methods来排队/查询/暂停/停止/ …一份工作。 对于查询作业,可以选择调用统一的作业存储(例如db)
虽然这对你来说可能有点过分了……但这是我的瑞士军刀。