使用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,你可以做的是将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));