J'ai un programme C# qui met en file d'attente un ensemble d'éléments de travail. Pour chaque élément de travail, je génère une autre application (que je ne peux pas modifier) pour traiter cet élément. Ce processus est relativement gourmand en ressources processeur. Je voudrais limiter le nombre d'instances de cette application.Limitation de la simultanéité des processus de génération et d'attente des processus de travail
J'ai pensé à utiliser PLINQ:
Parallel.ForEach(
workItems,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
x => Process.Start("worker", x).WaitForExit());
Mais ma préoccupation est que chaque travailleur parallèle utilisera simplement un thread pour attendre que le processus correspondant.
J'ai aussi vu que PLINQ essayait de grouper les articles retournés, ce qui signifie qu'il pourrait bloquer en attendant un lot de taille appropriée. Donc, peut-être un modèle mono-producteur/consommateur multiple utilisant BlockingCollection
fonctionnerait? Le problème avec cela est que j'aurais un thread pour chaque travailleur parallèle, ce qui serait (?) Pire que la solution PLINQ. Etant donné que ce qui précède est simplifié et que j'ai effectivement un TaskCompletionSource
connecté à chaque processus de travail (via l'événement Exited
), est-ce que je pourrais utiliser quelque chose de la TPL pour faire cela sans bloquer les threads d'arrière-plan?
À quel point le profilage de chaque thread dans le TPL était-il un problème? –
Désolé: exercice académique. En fait bloquer avec 4 (ou 8) threads n'est pas réellement un problème, mais j'aimerais en savoir plus sur les options de planification et de concurrence dans TPL. –
Pouvez-vous utiliser C# 5.0? – svick