Comment limiteriez-vous le nombre d'opérations par seconde?
Permet de dire que nous devons copier des fichiers d'un endroit à un autre et que nous ne voulons pas que plus de 5 fichiers soient traités par seconde. P> < P> S'il vous plaît voir ce que je fais p> mais j'ai besoin d'une manière plus élégante et anti-balle. p> p> p>
5 Réponses :
Je ferais une méthode simple qui traite cinq fichiers à la fois et appelez tous les secondes à l'aide d'une minuterie. p>
Brian, c'est une bonne idée mais je ne peux vraiment pas faire cela parce que je ne connais pas les articles à l'avance. C'est comme une file d'attente et je viens de les traiter comme ils viennent.
Notez que pendant que vous essayez de limiter le nombre d'éléments traités à 500 par seconde, le code ci-dessus exécute toujours une boucle serrée, mettant ainsi une charge sur la CPU même lorsqu'il ne traite pas de fichier. P>
Si vous voulez un véritable étranglement, vous devez modifier votre logique pour être axé sur la minuterie ou l'événement, ou utilisez l'une des méthodes d'attente * pour omettre votre processus en attendant la prochaine occasion de faire du travail. p>
Obtenez l'heure de départ, puis dans la boucle calculer le nombre maximum de fichiers à traiter jusqu'à l'heure actuelle, et veillez si vous êtes à l'avance:
for (int i = 1; i <= 100; i++ ) {
DateTime start = DateTime.UtcNow;
Console.WriteLine(i);
int left = (int)(start.AddSeconds(1.0 / 5.0) - DateTime.UtcNow).TotalMilliseconds;
if (left > 0) {
Thread.Sleep(left);
}
}
Eh bien, je dois faire max de 5 opérations par seconde. Je ne veux pas rattraper si une opération a pris plus de temps en la dernière seconde. BTW, qu'est-ce que cette ligne fait? Int Limite = (int) ((DateTime.utcnow - Démarrer) .ToTalSeconds * 5.0);
@Sumee: J'ai ajouté une alternative ci-dessus qui pourrait mieux vous adapter. La limite calculée est le nombre d'opérations qui auraient dû être effectuées à partir du début à l'heure actuelle. Si trois secondes sont passées, la limite sera de 15.
SUMEE
Vous pouvez utiliser une file d'attente de producteur / consommateur étranglé. Il aurait un fil d'arrière-plan qui fonctionne à un intervalle, le traitement de votre dossier. Vous pouvez enrocher les noms de fichiers tels qu'ils arrivent et que l'action de Dequue (Action) étranglée (Action) serait détresu. Voici un exemple de ce que je veux dire: p>
Il semble que aucune tâche ne soit traitée de manière synchrone dans votre code, des exécutions séquentielles seulement.
@Nonny; Oui, ce sont des opérations séquentielles.
@Danny Chen: HM ... c'est ce que signifie synchrone ...