使用 'ContinueWith' 的 IBackgroundJobManager 顺序作业
IBackgroundJobManager sequential jobs using '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 Problem。
如何在第一个后台作业完成后启动第二个后台作业? (问题十)
不支持保证作业的顺序和条件执行。
也就是说,后台作业会自动重试,这允许下面的方式 3。
因此,您可以通过以下方式之一有效地实现这一目标:
- 将两个作业合并为一个作业。
- 将第二个作业放入第一个作业中。
- 对两个作业进行排队(您不需要使用
ContinueWith
,await
更简洁)。在第二个工作中,检查第一个工作是否创建了它需要的东西。否则抛出异常,依赖重试。
使用 ContinueWith
时我需要什么语法? (解决方案 Y)
除了 Way 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")
);
我正在使用 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 Problem。
如何在第一个后台作业完成后启动第二个后台作业? (问题十)
不支持保证作业的顺序和条件执行。
也就是说,后台作业会自动重试,这允许下面的方式 3。
因此,您可以通过以下方式之一有效地实现这一目标:
- 将两个作业合并为一个作业。
- 将第二个作业放入第一个作业中。
- 对两个作业进行排队(您不需要使用
ContinueWith
,await
更简洁)。在第二个工作中,检查第一个工作是否创建了它需要的东西。否则抛出异常,依赖重试。
使用 ContinueWith
时我需要什么语法? (解决方案 Y)
除了 Way 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")
);