使用Hangfire: generic Enqueue方法抛出异常

本文关键字:方法 抛出异常 Enqueue Hangfire generic 使用 | 更新日期: 2023-09-27 17:49:20

我有一个简单的。net 4.5控制台应用程序与Hangfire。核心和Hangfire。SqlServer packages installed.

在我的main方法中,我像这样排队一个后台任务:

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

我的Test类是这样的:

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

当我F5我的程序,我得到一个异常与Enqueue:

"类型为'System '的未处理异常。InvalidOperationException"附加信息:变量't'"HangfireTest类型。测试"从作用域引用",但它不是定义"

当我用"new"在代码中创建我的Test类并使用非泛型Enqueue方法时-一切正常:

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

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

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

那么,我哪里做错了呢?

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

不能在调用方法的作用域中使用后台方法的返回值。这个特性不支持开箱即用。如果需要,可以考虑异步操作。这里有一个解决这个问题的方法。

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

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

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));