【发布时间】:2017-10-22 19:40:19
【问题描述】:
假设我有一些长期运行的后台作业。每个作业都会做一些工作,然后抓取下一个作业并运行它,一直持续到时间结束。
目前这是使用任务实现的。我有一个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);
}
工作流
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);
});
}
我的问题是,任务在这里是一个很好的举措,还是我应该以老式的方式创建线程?我最关心的是性能和确保作业可以独立运行而不会因为另一个人正在努力工作而陷入困境。
【问题讨论】:
-
您确实应该为此使用 Microsoft 的反应式框架 (NuGet "System.Reactive")。它更强大、更简单。
-
我去看看,谢谢。
-
@JoshM.,它让我想起了this question。
-
你也可以试试
TPL Dataflow
标签: c# multithreading performance async-await task