假设我有一些长时间运行的后台作业。每个作业都会执行一些工作,然后获取下一个作业并运行,一直执行到结束。
当前使用任务来实现。我有一个
当前使用任务来实现。我有一个
JobStream
,它在循环中一次运行一个作业。根据负载情况,我可以同时运行5、15或50个这样的流。
作业管理器
public Task Run(CancellationToken cancellationToken) {
var jobTasks = Enumerable
.Range(0, _config.BackgroundProcessor.MaximumSimultaneousJobs)
.Select(o => JobStream.StartNew(..., () => RunNextJob(cancellationToken), cancellationToken));
return Task.WhenAll(jobTasks);
}
JobStream
public static Task StartNew(Func<Task> nextJobRunner, CancellationToken cancellationToken) {
var jobStream = new JobStream(nextJobRunner, cancellationToken);
return jobStream.Start();
}
private Task Start() {
return Task.Run(async () => {
do {
await _nextJobRunner();
} while (!_cancellationToken.IsCancellationRequested);
});
}
我的问题是,任务是否在这里是一个好的选择,或者我应该按照旧有的方式创建线程?我主要关心的是性能和确保作业可以独立运行,而不会因为其他作业占用太多资源而被阻塞。
TPL Dataflow
。 - VMAtm