从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)

虽然这对你来说可能有点过分了……但这是我的瑞士军刀。

Hangfire就是你要找的。 最好的部分是内置仪表板。

您可能必须在其顶部编写一些逻辑。

你可以在这里找到它。 http://hangfire.io/

在此处输入图像描述

在此处输入图像描述