장기 실행 백그라운드 작업이 있다고 가정 해 보겠습니다. 각 직업은 약간의 일을하고, 다음 일을 잡고 실행하며, 끝날 때까지 계속됩니다.장기 실행 작업 대 스레드 - 성능
이것은 현재 작업을 사용하여 구현됩니다. 루프 내에서 한 번에 하나의 작업을 실행하는 JobStream
이 있습니다. 로드에 따라 한 번에 5 개, 15 개 또는 50 개 스트림을 실행할 수 있습니다.
JobManager
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의 Reactive Framework (NuGet "System.Reactive")를 사용해야합니다. 더 강력하고 간단합니다. – Enigmativity
감사합니다. 감사합니다. –
@ JoshM., 나에게 [이 질문] (https://stackoverflow.com/q/22492383/1768303)을 상기시켰다. – Noseratio