1. 程式人生 > >Hangfire源碼解析-任務是如何執行的?

Hangfire源碼解析-任務是如何執行的?

nts context one 生命周期 webtest int [] sin orm

一、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;
        }
        ....省略
    }
}

Hangfire源碼解析-任務是如何執行的?