IBackgroundJobManager 使用 '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<???>(???)时我需要的语法。

这似乎是一个 XY 问题。

第一个后台作业

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

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

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

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

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

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

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

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

带有ContinueWith的方式 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")
);

相关内容

  • 没有找到相关文章

最新更新