使用 Hangfire:通用 Enqueue<T> 方法抛出异常

Using Hangfire: generic Enqueue<T> method throws exception

我有一个简单的 .NET 4.5 控制台应用程序,其中安装了 Hangfire.Core 和 Hangfire.SqlServer 包。

在我的主要方法中,我将这样的后台作业排入队列:

BackgroundJob.Enqueue<Test>((t) => Console.WriteLine(t.Sum(3,4)));

我的测试 class 看起来像这样:

public class Test
{
    public Test(){ }

    public int Sum(int a, int b)
    {
        return a + b;
    }
}

当我 F5 我的程序时,我在 Enqueue 的行上遇到异常:

"An unhandled exception of type 'System.InvalidOperationException' occurred in System.Core.dll Additional information: variable 't' of type 'HangfireTest.Test' referenced from scope '', but it is not defined"

当我使用 "new" 在代码中创建测试 class 并使用非通用入队方法时 - 一切正常:

BackgroundJob.Enqueue(() => Console.WriteLine(new Test().Sum(3,4)));

但是我需要一个通用的,因为我想创建一个接口 ITest 并使用依赖注入来做这样的事情:

BackgroundJob.Enqueue<ITest>((t) => Console.WriteLine(t.Sum(3,4)));

那么,我做错了什么?

不能在调用方法的范围内消费后台方法的return值。此功能不支持开箱即用。如果这是您的要求,您可以考虑异步操作。 正如 here.

所讨论的那样,有一个解决方法

使用 Hangfire,你可以做的是将 Consonle.WriteLine 部分包装在一个单独的作业中,并将其作为后台作业排队。

所以你修改后的 class 可能看起来像这样 -

public class Test
{
    public Test() { }

    public int Sum(int a, int b)
    {
        return a + b;
    }

    public void SumJob(int a, int b)
    {
        var result = Sum(a, b);
        Console.WriteLine(result);
    }
}

...您现在可以像这样排队工作 -

BackgroundJob.Enqueue<Test>(t => t.SumJob(3, 4));