从ASP.NET或预定作业启动长时间运行的后台任务

时间:2015-01-23 12:00:31

标签: c# webforms asp.net-4.0 long-running-processes

我有一个相当长时间运行的过程(几分钟),我需要每个月大致运行一次 - 但不是按固定的时间表,而是在用户单击ASP.NET中的 Go 之后Webforms GUI页面。

由于ASP.NET实际上并不是为处理长时间运行的后台任务而设计的,我的想法是把它放到一个单独的控制台应用程序中。但是如何根据需要启动呢?

如果我在ASP.NET页面的代码隐藏中使用Process.Start(....)会怎样?我想避免阻止整个Web UI大约20分钟......而且:即使它没有阻止我的UI,如果ASP.NET应用程序池在循环时循环,我的长时间运行任务会发生什么它还在运行吗?

另一个想法是让一个频繁运行的作业(每2分钟运行一次)检查某种标志(例如存在一些数据库条目),如果需要,该作业将启动长时间运行的任务。 / p>

但是同样的问题:如果我使用Process.Start()从作业启动我的20分钟任务 - 是否会阻止来电者?

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

3 个答案:

答案 0 :(得分:7)

您正在寻找Hangfire。最好的部分是内置仪表板。

你可能必须在它的顶部写一些逻辑。

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

enter image description here

enter image description here

答案 1 :(得分:3)

首先关闭 - 有几个原因 - ASP.NET对于长期运行的任务/作业/ ......无论如何都是

我有很多次这个要求,总是像以下一样解决/分开:

<强>工人

的服务
  • Quartz.net(用于调度和处理,即使您没有特定的执行时间戳 - 但此框架中的整体处理非常棒)
  • 一个持久的求职店(处理开始/停止和完成/中止/暂停的工作)
  • 例如ServiceStack作为两个过程之间的互操作

网站
只需调用worker的一些webservice-methods来排队/查询/暂停/停止/ ...作业。对于查询作业,可以选择调用统一的作业存储(例如db)

虽然对你来说可能有点过分了......但这是我在这种情况下的瑞士军刀。

答案 2 :(得分:0)

像执行操作一样使用标准的内置Windows Task Scheduler,但是从Web应用程序中调用它。

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

SchTasks.exe /Run /TN Folder\Taskname

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