将一个方法传递给Hangfire Scheduler的另一个方法,而不是使用硬编码的方法名

本文关键字:方法 另一个 编码 Scheduler 一个 Hangfire | 更新日期: 2023-09-27 18:02:16

我正在使用Hangfire,并试图只是安排一个简单的工作。它的工作原理,如果我硬编码的方法的名称被触发在指定的时间,但我想更通用的东西,即传递任何方法到这段代码,让Hangfire执行它的时间表。

这是我尝试的一种方法。

public static void ScheduleSingleRun(Activity parametersStorage, Action<Activity, int> scheduledFunction, int secondsDelay)
{
    TimeSpan offset = new TimeSpan(0, 0, secondsDelay);
    try
    {
        BackgroundJob.Schedule(() => 
            scheduledFunction(parametersStorage, secondsDelay), offset);
        return new HangfireSchedulerResponse("Scheduled successfully.", 0);          
        ... 
下面是我调用这个函数的方式:
HangfireScheduler.ScheduleSingleRun(parameters, TestMethod, 15);

其中TestMethod是同一类中的方法名。

此代码可以编译,但在运行时导致以下错误:

Expression body should be of type `MethodCallExpression`"

我尝试了Action, Func<>, Delegate -没有效果。只指定显式方法名即可:

BackgroundJob.Schedule(() => TestClass.TestMethod(parametersStorage, secondsDelay)

我做错了什么-有一种方法只是传递一个方法名称/引用Hangfire而不是硬编码?

将一个方法传递给Hangfire Scheduler的另一个方法,而不是使用硬编码的方法名

参见下面的示例。在你的例子中,我认为你必须传递一个表达式。在我的例子中,你应该传递"lambda"变量到你的BackgroundJob。调度方法。

class Program
{
    static void Main(string[] args)
    {
        int param1Value = 2;
        object param2Value = "hello";
        var param1 = Expression.Parameter(typeof(int));
        var param2 = Expression.Parameter(typeof(object));
        var testMethodInfo = typeof(MyClass).GetMethod("TestMethod", BindingFlags.Public | BindingFlags.Static);
        var exp = Expression.Call(testMethodInfo, param1, param2);
        var lambda = Expression.Lambda<Action<int, object>>(exp, param1, param2);
        lambda.Compile().Invoke(param1Value, param2Value);
    }
}
static class MyClass
{
    public static void TestMethod(int param1, object param2)
    {
        Console.WriteLine(param1);
        Console.WriteLine(param2?.ToString());
    }
}