我有一个安装了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)));
那么,我在这里做错了什么?
答案 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));