使用IBackgroundJobManager的连续作业,使用'ContinueWith'

问题描述 投票:0回答:1

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

用例:

我正在处理一个上传的文件。保存文件后,我想依次启动两个单独的Abp.BackgroundJobs。仅在第一个作业完成后应该启动第二个作业。

这是我的代码:

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

问题:

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

c# jobs aspnetboilerplate abp continuewith
1个回答
0
投票

这似乎是XY Problem

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

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

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

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

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

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

没有语法,除了方法3的一个不太理想的变体。

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

带有EnqueueAsync的方式3的语法类似于:

ContinueWith

比较为:

var measureJobId = await _backgroundJobManager.EnqueueAsync<FileProcessBackgroundJob, FileProcessJobArgsDto>(
        new FileProcessJobArgsDto
        {
            Id = Id,
            User = user,
        }
    )
    .ContinueWith(task => _backgroundJobManager.EnqueueAsync<AnalyticsBackgroundJob, AnalyticsJobArgsDto>(
        new AnalyticsJobArgsDto("measureJob")
    )
    .Unwrap();
© www.soinside.com 2019 - 2024. All rights reserved.