IBackgroundJobManager连续作业,使用“ ContinueWith”

时间:2019-12-27 22:25:50

标签: c# jobs aspnetboilerplate abp continuewith

我正在将IBackgroundJobManager与Hangfire集成使用。

用例:

我正在处理一个上传的文件。保存文件后,我想依次启动两个单独的Abp.BackgroundJobs。只有在第一项工作完成后 ,第二项工作才能开始。

这是我的代码:

var measureJob1 = await _backgroundJobManager.EnqueueAsync<FileProcessBackgroundJob, FileProcessJobArgsDto>(
        new FileProcessJobArgsDto
        {
            Id = Id,
            User = user,
        })
    .ContinueWith<AnalyticsBackgroundJob<AnalyticsJobArgsDto>>("measureJob",x => x);

问题:

使用.ContinueWith<???>(???)时我找不到所需的语法。

1 个答案:

答案 0 :(得分:1)

这似乎是XY Problem

第一个完成后如何启动第二个后台作业? (问题X)

不支持保证作业的顺序和条件执行。

也就是说,后台作业会自动重试,这允许下面的方法3。

因此,您可以通过以下方式之一有效地实现这一目标:

  1. 将两个工作合并为一个工作。
  2. 将第二份工作排入第一份工作。
  3. 同时入列两个作业(您无需使用ContinueWithawait更加整洁)。在第二个作业中,检查第一个作业是否创建了所需的内容。否则,抛出异常并依靠重试。

使用ContinueWith时需要什么语法? (解决方案Y)

除了方法3的一种不太理想的变体以外,没有其他语法。

Task.ContinueWith是一种C#构造,它在EnqueueAsync任务之后运行,而不是实际的后台作业。

使用ContinueWith的Way 3的语法类似于:

var measureJobId = await _backgroundJobManager.EnqueueAsync<FileProcessBackgroundJob, FileProcessJobArgsDto>(
        new FileProcessJobArgsDto
        {
            Id = Id,
            User = user,
        }
    )
    .ContinueWith(task => _backgroundJobManager.EnqueueAsync<AnalyticsBackgroundJob, AnalyticsJobArgsDto>(
        new AnalyticsJobArgsDto("measureJob")
    )
    .Unwrap();

将其与以下内容进行比较:

var processJobId = await _backgroundJobManager.EnqueueAsync<FileProcessBackgroundJob, FileProcessJobArgsDto>(
        new FileProcessJobArgsDto
        {
            Id = Id,
            User = user,
        }
    );

var measureJobId = await _backgroundJobManager.EnqueueAsync<AnalyticsBackgroundJob, AnalyticsJobArgsDto>(
        new AnalyticsJobArgsDto("measureJob")
    );