使用Hangfire:泛型Enqueue <t>方法抛出异常

时间:2016-06-24 07:22:31

标签: c# hangfire

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

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

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

My Test类看起来像这样:

public class Test
{
    public Test(){ }

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

当我F5我的程序时,我在Enqueue的行上得到一个例外:

  

“类型'System.InvalidOperationException'的未处理异常   发生在System.Core.dll中的附加信息:变量't'   输入范围''引用的'HangfireTest.Test',但事实并非如此   定义的“

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

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

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

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

那么,我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

您不能在调用方法的范围内使用后台方法的返回值。开箱即用不支持此功能。如果这是您的要求,您可以考虑异步操作。 正如here所述,有一种解决方法。

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