我想在Hangfire的后台启动服务的子对象中的方法。所以这就是我的工作。
BackgroundJob.Enqueue<IMyService>(myService => myService.SubObject.MyPublicMethodAsync());
但它引发了一个例外,因为MyPublicMethodAsync
位于SubObject
而不是IMyService
,因为HangFire中有以下验证码:
if (!method.DeclaringType.GetTypeInfo().IsAssignableFrom(type.GetTypeInfo()))
{
throw new ArgumentException(
$"The type `{method.DeclaringType}` must be derived from the `{type}` type.",
typeParameterName);
}
https://github.com/HangfireIO/Hangfire/blob/master/src/Hangfire.Core/Common/Job.cs(第391行)
我目前的解决方法是:
public Task DoWhatIWant()
{
return _myService.SubObject.MyPublicMethodAsync();
}
和
BackgroundJob.Enqueue(() => DoWhatIWant());
但它非常难看,所以你知道这样做的正确方法吗?
答案 0 :(得分:1)
根据this related article,Hangfire任务被序列化为单个方法调用。你不能写那样复杂的表达;它根本不受支持。
您可以通过编写方法并直接调用它来解决问题,如下所示:
class MyService : IService
{
public void DoWhatIWant()
{
this.SubObject.MyPublicMethodAsync();
}
}
BackgroundJob.Enqueue<IService>( s => s.DoWhatIWant() );