启动一个长 运行 的后台任务 - 来自 ASP.NET 或计划的作业

Launching a long-running background task - from ASP.NET or a scheduled job

我有一个相当长的 运行ning 过程(几分钟),我需要大约每月 运行 一次 - 但不是固定的时间表,而是在用户点击 转到 ASP.NET Webforms GUI 页面。

因为 ASP.NET 确实不是为处理长时间的 运行ning 后台任务而设计的,我的想法是将其放入一个单独的控制台应用程序中。但是如何根据需要启动它呢?

如果我使用 ASP.NET 页面的代码隐藏中的 Process.Start(....) 会怎样?我想避免阻塞整个 Web UI 20 分钟左右......而且:即使它不阻塞我的 UI,我的 long-运行 会怎样如果 ASP.NET 应用程序池在 运行ning 时回收任务?

另一个想法是经常 运行ning 作业(每 2 分钟 运行s)检查某种标志(例如某些数据库条目的存在),如果需要,然后,该作业将启动长 运行ning 任务。

但同样的问题:如果我从使用 Process.Start() 的工作中启动我的 20 分钟任务 - 这会阻止调用者吗?

将如此长的 运行ning 任务一天安排五次似乎有点矫枉过正,因为它通常 运行 每个月只安排一次 - 但与此同时,用户期望在安排流程后在合理的时间内(如果可能的话,不到 1 小时)得到他的结果 - 所以我真的不能只在晚上安排一次 运行 ...

首先 - 出于几个原因 - ASP.NET 恕我直言 而不是 长期 运行 tasks/jobs/... 的解决方案.

这个需求我已经有很多次了,而且总是solved/separated这样:

工人

的服务
  • Quartz.net(用于调度和处理,即使你没有特定的时间戳来执行——但这个框架的整体处理简直太棒了)
  • 持久作业存储(处理 start/stop 和 completed/aborted/paused 作业)
  • 例如ServiceStack作为两个进程之间的互操作

网站
只需将工作人员的一些网络服务方法调用到 enqueue/query/pause/stop/... 一项工作。对于查询作业,调用统一的作业存储可能是一个选项(例如 db)

虽然这对你来说可能有点矫枉过正......但这是我用于此类情况的瑞士军刀。

Hangfire 正是您要找的。最好的部分是它带有一个内置的仪表板。

你可能需要在上面写一些逻辑。

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

像您一样使用标准的内置 Windows 任务计划程序,但是从您的 Web 应用程序调用它。

在任务计划程序中配置您的任务。它不需要有预定的触发器。在您的 Web 应用程序中,只需使用 Process.Start 启动它:

SchTasks.exe /Run /TN Folder\Taskname

我没有直接使用 SchTasks.exe,而是使用了 Microsoft.Win32.TaskScheduler 包装器 类。