使用 Hangfire:通用 Enqueue<T> 方法抛出异常
Using Hangfire: generic Enqueue<T> method throws exception
我有一个简单的 .NET 4.5 控制台应用程序,其中安装了 Hangfire.Core 和 Hangfire.SqlServer 包。
在我的主要方法中,我将这样的后台作业排入队列:
BackgroundJob.Enqueue<Test>((t) => Console.WriteLine(t.Sum(3,4)));
我的测试 class 看起来像这样:
public class Test
{
public Test(){ }
public int Sum(int a, int b)
{
return a + b;
}
}
当我 F5 我的程序时,我在 Enqueue 的行上遇到异常:
"An unhandled exception of type 'System.InvalidOperationException'
occurred in System.Core.dll Additional information: variable 't' of
type 'HangfireTest.Test' referenced from scope '', but it is not
defined"
当我使用 "new" 在代码中创建测试 class 并使用非通用入队方法时 - 一切正常:
BackgroundJob.Enqueue(() => Console.WriteLine(new Test().Sum(3,4)));
但是我需要一个通用的,因为我想创建一个接口 ITest 并使用依赖注入来做这样的事情:
BackgroundJob.Enqueue<ITest>((t) => Console.WriteLine(t.Sum(3,4)));
那么,我做错了什么?
不能在调用方法的范围内消费后台方法的return值。此功能不支持开箱即用。如果这是您的要求,您可以考虑异步操作。
正如 here.
所讨论的那样,有一个解决方法
使用 Hangfire,你可以做的是将 Consonle.WriteLine
部分包装在一个单独的作业中,并将其作为后台作业排队。
所以你修改后的 class 可能看起来像这样 -
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));
我有一个简单的 .NET 4.5 控制台应用程序,其中安装了 Hangfire.Core 和 Hangfire.SqlServer 包。
在我的主要方法中,我将这样的后台作业排入队列:
BackgroundJob.Enqueue<Test>((t) => Console.WriteLine(t.Sum(3,4)));
我的测试 class 看起来像这样:
public class Test
{
public Test(){ }
public int Sum(int a, int b)
{
return a + b;
}
}
当我 F5 我的程序时,我在 Enqueue 的行上遇到异常:
"An unhandled exception of type 'System.InvalidOperationException' occurred in System.Core.dll Additional information: variable 't' of type 'HangfireTest.Test' referenced from scope '', but it is not defined"
当我使用 "new" 在代码中创建测试 class 并使用非通用入队方法时 - 一切正常:
BackgroundJob.Enqueue(() => Console.WriteLine(new Test().Sum(3,4)));
但是我需要一个通用的,因为我想创建一个接口 ITest 并使用依赖注入来做这样的事情:
BackgroundJob.Enqueue<ITest>((t) => Console.WriteLine(t.Sum(3,4)));
那么,我做错了什么?
不能在调用方法的范围内消费后台方法的return值。此功能不支持开箱即用。如果这是您的要求,您可以考虑异步操作。 正如 here.
所讨论的那样,有一个解决方法使用 Hangfire,你可以做的是将 Consonle.WriteLine
部分包装在一个单独的作业中,并将其作为后台作业排队。
所以你修改后的 class 可能看起来像这样 -
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));