長時間実行されているバックグラウンドジョブがあるとします。各仕事は何らかの仕事をしてから、次の仕事をつかんで実行し、時間が終わるまで続けます。長期実行タスクとスレッド - パフォーマンス
これは現在、タスクを使用して実装されています。ループ内で一度に1つのジョブを実行する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);
}
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);
});
}
私の質問、タスクはここで良い動きしている場合、または私はちょうどスレッドに昔ながらの方法を作成する必要がありますか?私は主にパフォーマンスについて心配しています。別の仕事が苦労しているため、仕事が縛られることなく独立して動くことを保証しています。
これは本当にMicrosoftのリアクティブフレームワーク(NuGet "System.Reactive")を使用する必要があります。よりパワフルで簡単です。 – Enigmativity
私はそれをチェックします、ありがとう。 –
@ JoshM。それは私に[この質問](https://stackoverflow.com/q/22492383/1768303)を思い出させました。 – Noseratio