C# 局部范围

C# 局部范围,c#,hangfire,C#,Hangfire,我想使用Hangfire创建长时间运行的fire并忘记任务。如果web服务器死机,并且后台作业被重试,我希望它继续执行它停止的操作 在下面的示例中,假设foo.RetryCountreacts 3->server restarts->Hangfire重新运行作业。在这种情况下,我只想再运行任务7次(基于MaxAttemps),而不是从零重新启动 我认为Hangfire将传递给方法的参数保持在其当前状态,但据我所知,它们已重置 var foo = new Foo { RetryCount = 0,

我想使用Hangfire创建长时间运行的fire并忘记任务。如果web服务器死机,并且后台作业被重试,我希望它继续执行它停止的操作

在下面的示例中,假设
foo.RetryCount
reacts 3->server restarts->Hangfire重新运行作业。在这种情况下,我只想再运行任务7次(基于
MaxAttemps
),而不是从零重新启动

我认为Hangfire将传递给方法的参数保持在其当前状态,但据我所知,它们已重置

var foo = new Foo { RetryCount = 0, MaxAttemps = 10 };
BackgroundJob.Enqueue(() => RequestAndRetryOnFailure(foo));

void RequestAndRetryOnFailure(Foo foo) 
{
    // make request to server, if fail, wait for a 
    // while and try again later if not foo.MaxAttemps is reached
    foo.RetryCount++;
}

我广泛使用hangfire执行许多不同的操作,并且经常需要重新安排已启动但由于某些限制而无法执行的作业

您所指的持久性发生在作业的序列化版本中,该作业已被授权,但一旦执行就不再保留

我的建议是,如果服务器不可用,将作业安排在一定时间后执行。如果作业已安排且hangfire重新启动,这也将有助于重新启动作业

var foo = new Foo { RetryCount = 0, MaxAttemps = 10 };
BackgroundJob.Enqueue(() => RequestAndRetryOnFailure(foo));

void RequestAndRetryOnFailure(Foo foo) 
{
    // make request to server, if fail, wait for a 
    // while and try again later if not foo.MaxAttemps is reached
    if (request to server failed) 
    {
        foo.RetryCount ++;
        If (foo.RetryCount < foo.MaxAttempts)
            BackgroundJob.Schedule(RequestAndRetryOnFailure(foo), Timespan.FromSeconds(30));
        else
             return; // do nothing
    }
}
var foo=newfoo{RetryCount=0,MaxAttemps=10};
BackgroundJob.Enqueue(()=>RequestAndRetryOnFailure(foo));
无效请求和重试失败(Foo-Foo)
{
//向服务器发出请求,如果失败,请等待
//而如果未达到foo.MaxAttemps,请稍后重试
if(对服务器的请求失败)
{
foo.RetryCount++;
If(foo.RetryCount
我试图指出的一点是,在执行QUED作业之前,状态一直保存在数据库中。一旦它执行,就没有更多的状态或作业,除了在尝试了一点hangfire之后的循环,这正是我想要的,再次感谢