HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于大家来说,比较方便。
HangFire是什么
Hangfire是一个开源框架(.NET任务调度框架),可以帮助您创建,处理和管理您的后台作业,处理你不希望放入请求处理管道的操作:
- 通知/通讯;
- xml,csv,json批量导入;
- 创建档案;
- 发射web hooks;
- 删除用户;
- 建立不同的图表;
- 图像/视频处理;
- 清除临时文件;
- 反复出现的自动报告;
- 数据库维护
Hangfire支持所有类型的后台任务 - 短时间运行和长时间运行, CPU intensive
和I/O intensive
,一次性的和经常性的。你不需要重新发明轮子 ,可以直接使用。
Hangfire包含三大核心组件:客户端、持久化存储、服务端。看看官方的这张图:
Hangfire基础
- 基于队列的任务处理(Fire-and-forget)
延迟作业也只执行一次,但不会立即执行 - 只能在指定的时间间隔后执行。
var jobId = BackgroundJob.Schedule(
() => Console.WriteLine("Delayed!"),
TimeSpan.FromDays(7));
- 定时执行(Recurring)
按照指定的CRON计划, 重复执行的作业会被多次触发。
RecurringJob.AddOrUpdate(
() => Console.WriteLine("Recurring!"),
Cron.Daily);
- 延续性执行(Continuations)
延续性任务类似于.NET中的Task
,可以在第一个任务执行完之后紧接着再次执行另外的任务:
BackgroundJob.ContinueWith(
jobId,
() => Console.WriteLine("Continuation!"));
- 延时执行任务(Delayed)
延迟作业也只执行一次,但不会立即执行 - 只能在指定的时间间隔后执行。
var jobId = BackgroundJob.Schedule(
() => Console.WriteLine("Delayed!"),
TimeSpan.FromDays(7));
- 批处理(Batches)
批处理是一组自动创建的后台作业。
var batchId = Batch.StartNew(x =>
{
x.Enqueue(() => Console.WriteLine("Job 1"));
x.Enqueue(() => Console.WriteLine("Job 2"));
});
- 延时批处理(Batch Continuations)
批处理在父类完成后触发后台作业。
Batch.ContinueWith(batchId, x =>
{
x.Enqueue(() => Console.WriteLine("Last Job"));
});
- 后台进程(Background Process)
当你需要在应用程序的整个生命周期中连续运行后台进程时使用它们。
public class CleanTempDirectoryProcess : IBackgroundProcess
{
public void Execute(BackgroundProcessContext context)
{
Directory.CleanUp(Directory.GetTempDirectory());
context.Wait(TimeSpan.FromHours(1));
}
}
后台作业是应用程序中非常重要的部分,Hangfire
确保至少执行一次任务。要在应用程序重新启动之间保留后台作业信息,所有信息都将保存在您最喜欢的持久性存储中。
Hangfire将您的任务保存到持久化库汇总,并且以可靠的方式处理它们。这意味着,你可以中断Hangfire Worder
的线程,重新加载应用程序域,或者终止程序,即使这样您的任务仍会被处理。只有在你代码的最后一行执行完成,Hangfire
才会标记这个任务完成。并且知道任务可能在最后一行代码执行之前失败。它包含多种 自动-重试机制,它可以自动处理在存储或代码执行过程中发生的错误。
这对于通用托管环境(如IIS Server)非常重要。它们可以包含不的
优化,超时和错误处理代码 (可能导致进程终止)来防止不好的事情发生。如果您没有使用可靠的处理和自动机制,您的工作可能会丢失。您的最终用户可能无限期等待某些任务,如电子邮件,报告,通知等。
实操演练
光说不练假把式,下面我们新建一个w