2011-10-10 3 views
1

Je dois implémenter un module qui peut avoir plusieurs entrées dans un dictionnaire (plusieurs threads qui écrivent dans un dictionnaire) et 1 consommateur temporisé qui prend ce dictionnaire, l'envoie en utilisant un certain ISender et efface le dictionnaire pour une nouvelle masse de données. Le problème est que j'ai besoin de concevoir mes verrouillages de cette façon que le thread consommant prend l'instantané le plus rapide de la masse tout en permettant aux threads en production de continuer à écrire dans un nouveau dictionnaire effacé. Quel est le meilleur design de producteur de consommation que vous suggéreriez d'utiliser les interverrouillages et ConcurrentDictionary?producteur consommateur C# implémentation avec 1 consommateur temporisé pour un algorithme d'envoi groupé

Cordialement!

Répondre

1

Ne laissez pas les threads producteurs mettre directement les données dans le dictionnaire. Laissez-les le mettre dans une file d'attente thread-safe, comme BlockingCollection. Votre thread de consommation peut alors prendre des éléments de la file d'attente, créer le dictionnaire et l'envoyer, sans bloquer les threads de production. Essentiellement, le même travail est effectué, mais il est «étalé» de manière à éviter la plupart des blocages. Si vous êtes très préoccupé par la contention dans cette seule file d'attente, vous pouvez même avoir un thread BlockingCollection par producteur, puis utiliser BlockingCollection.TakeFromAny dans le consommateur.


Le problème est, bien sûr, si vos threads consommateurs font autre chose que d'écrire simplement dans le dictionnaire. S'ils ont besoin, par exemple, de vérifier si la clé donnée existe déjà dans le dictionnaire, alors cette conception devient soudainement beaucoup plus compliquée.

1

Le moyen le plus rapide à mon avis est d'utiliser plusieurs objets de dictionnaire. Lorsque votre thread de consommation s'exécute, il crée un nouveau ConcurrentDictionary et le définit comme le dictionnaire "live". C'est rapide et signifie que les producteurs peuvent continuer avec une interruption minimale.

Le thread consommateur "possède" l'objet dictionnaire précédent et peut traiter son contenu à son propre rythme.

Questions connexes