我正在将IBackgroundJobManager
与Hangfire集成使用。
用例:
我正在处理一个上传的文件。保存文件后,我想依次启动两个单独的Abp.BackgroundJobs
。只有在第一项工作完成后 ,第二项工作才能开始。
这是我的代码:
var measureJob1 = await _backgroundJobManager.EnqueueAsync<FileProcessBackgroundJob, FileProcessJobArgsDto>(
new FileProcessJobArgsDto
{
Id = Id,
User = user,
})
.ContinueWith<AnalyticsBackgroundJob<AnalyticsJobArgsDto>>("measureJob",x => x);
问题:
使用.ContinueWith<???>(???)
时我找不到所需的语法。
答案 0 :(得分:1)
这似乎是XY Problem。
不支持保证作业的顺序和条件执行。
也就是说,后台作业会自动重试,这允许下面的方法3。
因此,您可以通过以下方式之一有效地实现这一目标:
ContinueWith
,await
更加整洁)。在第二个作业中,检查第一个作业是否创建了所需的内容。否则,抛出异常并依靠重试。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")
);