博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hangfire源码解析-任务是如何执行的?
阅读量:6168 次
发布时间:2019-06-21

本文共 1913 字,大约阅读时间需要 6 分钟。

一、Hangfire任务执行的流程

  1. 任务创建时:
    • 将任务转换为Type并存储(如:HangFireWebTest.TestTask, HangFireWebTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)
    • 将参数序列化后存储
  2. 任务执行时:
    • 根据Type值判断是否是静态方法,若非静态方法就根据Type从IOC容器中取实例。
    • 反序列化参数
    • 使用反射调用方法:MethodInfo.Invoke

二、Hangfire执行任务

从源码中找到“CoreBackgroundJobPerformer”执行任务的方法

internal class CoreBackgroundJobPerformer : IBackgroundJobPerformer{    private readonly JobActivator _activator;   //IOC容器    ....省略        //执行任务    public object Perform(PerformContext context)    {        //创建一个生命周期        using (var scope = _activator.BeginScope(            new JobActivatorContext(context.Connection, context.BackgroundJob, context.CancellationToken)))        {            object instance = null;            if (context.BackgroundJob.Job == null)            {                throw new InvalidOperationException("Can't perform a background job with a null job.");            }                        //任务是否为静态方法,若是静态方法需要从IOC容器中取出实例            if (!context.BackgroundJob.Job.Method.IsStatic)            {                instance = scope.Resolve(context.BackgroundJob.Job.Type);                if (instance == null)                {                    throw new InvalidOperationException(                        $"JobActivator returned NULL instance of the '{context.BackgroundJob.Job.Type}' type.");                }            }            var arguments = SubstituteArguments(context);            var result = InvokeMethod(context, instance, arguments);            return result;        }    }    //调用方法    private static object InvokeMethod(PerformContext context, object instance, object[] arguments)    {        try        {            var methodInfo = context.BackgroundJob.Job.Method;            var result = methodInfo.Invoke(instance, arguments);//使用反射调用方法            ....省略                        return result;        }        ....省略    }}

转载于:https://www.cnblogs.com/yrinleung/p/10552976.html

你可能感兴趣的文章
amd cmd
查看>>
Linux下的uml画图工具
查看>>
xml返回数组数据
查看>>
约瑟夫问题总结
查看>>
spring mybatis 批量插入返回主键
查看>>
指针函数小用
查看>>
开源力量公开课第二十三期-从SVN到Git,次时代代码管理
查看>>
输入挂
查看>>
升级迁移前,存储过程统计各个用户下表的数据量,和迁移后的比对
查看>>
sql注入分类
查看>>
初识CSS选择器版本4
查看>>
[Hadoop in China 2011] 朱会灿:探析腾讯Typhoon云计算平台
查看>>
JavaScript之数组学习
查看>>
PHP 设置响应头来解决跨域问题
查看>>
CAS实现SSO单点登录原理
查看>>
博客园美化专用图片链接
查看>>
HDU_1969_二分
查看>>
高等代数葵花宝典—白皮书
查看>>
一种简单的图像修复方法
查看>>
基于DobboX的SOA服务集群搭建
查看>>