avoir ce que je suppose est un scénario de filetage assez commun:files d'attente de discussion pour les nuls
- J'ai 100 emplois identiques pour compléter
- Tous les emplois sont indépendants les uns autres
- Je veux traiter un maximum de 15 emplois à temps
- Comme chaque emploi finalise, un nouvel emploi sera lancé jusqu'à ce que tous les travaux ont été achevés
Si vous supposez que chaque travail déclenchera un événement lorsqu'il terminera (j'utilise la classe BackgroundWorker), je peux penser à quelques façons de le faire, mais je ne suis pas sûr de ce que le " droite "solution est. J'espérais que certains d'entre vous, les gourous, pourraient me pointer dans la bonne direction.
SOLUTION 1: Avez-vous un while (continuez) {Threading.Sleep (1000); } boucle dans ma fonction Main(). Le code dans le gestionnaire d'événements Job_Completed définira continue = false lorsque A) aucun travail reste à être mis en file d'attente et B) tous les travaux en attente ont terminé. J'ai utilisé cette solution avant et pendant qu'il semble fonctionner bien ... il me semble un peu "étrange".
SOLUTION 2: Utilisez Application.Run() dans ma fonction Main(). De même, le code dans le gestionnaire d'événements Job_Completed appelle Application.Exit() lorsque A) aucun travail reste à être mis en file d'attente et B) tous les travaux en attente ont terminé.
SOLUTION 3: Utilisez un ThreadPool, mettez en file d'attente toutes les demandes 500-1000, laissez-les s'exécuter 10 à la fois (SetMaxThreads) et d'une manière ou d'une autre attendez qu'elles soient toutes terminées.
Dans toutes ces solutions, l'idée de base est qu'un nouveau travail est démarré chaque fois qu'un autre travail est terminé, jusqu'à ce qu'il ne reste plus de travail. Ainsi, le problème n'attend pas seulement que les travaux existants soient terminés, mais attend également qu'il n'y ait plus de travail en attente pour démarrer. Si ThreadPool est la bonne solution, quelle est la bonne façon d'attendre sur le ThreadPool pour terminer tous les éléments mis en file d'attente?
Je pense que ma confusion dominante ici est que je ne comprends pas exactement comment les événements peuvent se déclencher à partir de ma fonction Main(). Apparemment ils le font, je ne comprends tout simplement pas la mécanique d'un point de vue de la boucle de message Windows. Quelle est la bonne façon de résoudre ce problème, et pourquoi?
Il semble que la plupart des suggestions s'articulent autour d'une solution de style ThreadPool ... qu'en est-il de ma solution SOLUTION 1 et SOLUTION 2 ci-dessus (essentiellement en attente d'une condition à modifier par un événement)? Y a-t-il quelque chose d'intrinsèquement mauvais à faire ainsi, ou est-ce juste que .NET fournit ThreadPool donc ce n'est pas nécessaire? Il semble étrange d'avoir un code comme celui-ci: while (continuez) Threading.Sleep (1000); ... en attendant que les événements se déclenchent dans la fonction Main(). Dans un code comme celui-ci ... quand exactement mes événements sont-ils traités ... quelque part dans l'appel Sleep()? –