-1

我正在使用IBackgroundJobManagerHangfire 集成。

用例:

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

这是我的代码:

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

问题:

我无法弄清楚使用.ContinueWith<???>(???).

4

1 回答 1

2

这似乎是一个XY 问题

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

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

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

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

  1. 将两项工作合并为一项工作。
  2. 将第二个作业排入第一个作业中。
  3. 将两个工作都排入队列(你不需要使用ContinueWithawait更整洁)。在第二个作业中,检查第一个作业是否创建了它需要的内容。否则,抛出异常并依赖重试。

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

除了方式 3 的一个不太理想的变体之外,没有任何语法。

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

Way 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();

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

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

var measureJobId = await _backgroundJobManager.EnqueueAsync<AnalyticsBackgroundJob, AnalyticsJobArgsDto>(
        new AnalyticsJobArgsDto("measureJob")
    );
于 2019-12-28T10:45:47.690 回答