一、Hangfire任務執行的流程 1. 任務創建時: 將任務轉換為Type並存儲(如:HangFireWebTest.TestTask, HangFireWebTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null) 將參數序列化後存 ...
一、Hangfire任務執行的流程
- 任務創建時:
- 將任務轉換為Type並存儲(如:HangFireWebTest.TestTask, HangFireWebTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)
- 將參數序列化後存儲
- 任務執行時:
- 根據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;
}
....省略
}
}