我有一个安装了Hangfire.Core和Hangfire.SqlServer软件包的简单.NET 4.5控制台应用程序.
在我的主要方法中,我将这样的后台作业排入队列:
BackgroundJob.Enqueue<Test>((t) => Console.WriteLine(t.Sum(3,4)));
Run Code Online (Sandbox Code Playgroud)
我的Test类看起来像这样:
public class Test
{
public Test(){ }
public int Sum(int a, int b)
{
return a + b;
}
}
Run Code Online (Sandbox Code Playgroud)
当我F5我的程序时,我在Enqueue的行上得到一个例外:
"System.Core.dll中发生了'System.InvalidOperationException'类型的未处理异常附加信息:从范围''引用的'HangfireTest.Test'类型的变量't',但未定义"
当我用"new"在代码中创建我的Test类并使用非泛型Enqueue方法时 - 一切正常:
BackgroundJob.Enqueue(() => Console.WriteLine(new Test().Sum(3,4)));
Run Code Online (Sandbox Code Playgroud)
但我需要一个通用的,因为我想创建一个接口ITest并使用依赖注入来做这样的事情:
BackgroundJob.Enqueue<ITest>((t) => Console.WriteLine(t.Sum(3,4)));
Run Code Online (Sandbox Code Playgroud)
那么,我在这里做错了什么?
不能在调用方法的范围内消费后台方法的返回值。开箱即用不支持此功能。如果这是您的要求,您可以考虑异步操作。此处讨论了一种解决方法。
使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
......你现在可以像这样排队工作 -
BackgroundJob.Enqueue<Test>(t => t.SumJob(3, 4));
Run Code Online (Sandbox Code Playgroud)