from:https://blogs.msdn.microsoft.com/scott_hanselman/2014/12/21/asp-net/
[原文发表地址] How to run Background Tasks in ASP.NET
[原文发表时间] 2014-08-26
几年前,Phil Haack写了一篇关于ASP.NET中定期后台任务存在的隐患的优秀文章。他指出了一些人们在后台工作时常见的陷阱。您可阅读这篇文章,下面是他帖子里得出的摘要。
using System;using System.Threading;using System.Threading.Tasks; namespace WebBackgrounder.DemoWeb{ public class SampleJob : Job { public SampleJob(TimeSpan interval, TimeSpan timeout) : base("Sample Job", interval, timeout) { } public override Task Execute() { return new Task(() => Thread.Sleep(3000)); } }}
建立:QueueBackgroundWorkItem-加入.NET4.5.2在某种程度上对WebBackgrounder的需产生影响,QueueBackgroundWorkItem作为一个新的API被添加于.NET 4.5.2 中。它不只是一个”Task.Run”,它的功能还有很多: QBWI预设了一个可以在后台运行的任务,它独立于任何需求。这不同于平常的ASP.NET线程池工作项,ASP.NET自动记录有多少个通过API注册的工作项正在运行,并且ASP.NET运行时会延迟AppDomain的关闭,直到工作项停止执行。
为了保证任务完成,它可以延迟AppDomain关闭长达90秒。如果你在90秒内无法完成,那么你需要一个不同的(更健壮的,更有意义的,进程以外的)技术。
这个API非常简单,使用Func<CancellationToken, Task>。这里有一个从MVC截取的后台工作项例子:
public ActionResult SendEmail([Bind(Include = "Name,Email")] User user){ if (ModelState.IsValid) { HostingEnvironment.QueueBackgroundWorkItem(ct => SendMailAsync(user.Email)); return RedirectToAction("Index", "Home"); } return View(user);} FluentScheduler
FluentScheduler 是一个更精密和复杂的调度程序,它有一个(如你所想)流畅的界面。当你的任务运行时你是真正地显式控制。
using FluentScheduler;public class MyRegistry : Registry{ public MyRegistry() { // Schedule an ITask to run at an interval Schedule<MyTask>().ToRunNow().AndEvery(2).Seconds(); // Schedule a simple task to run at a specific time Schedule(() => Console.WriteLine("Timed Task - Will run every day at 9:15pm: " + DateTime.Now)).ToRunEvery(1).Days().At(21, 15); // Schedule a more complex action to run immediately and on an monthly interval Schedule(() => { Console.WriteLine("Complex Action Task Starts: " + DateTime.Now); Thread.Sleep(1000); Console.WriteLine("Complex Action Task Ends: " + DateTime.Now); }).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0); }}