J'ai une précédente question que j'ai fourni ma solution; Cependant, je n'ai pas accès à Ma tâche est maintenant de déterminer si je peux dériver ma propre classe de file d'attente simultanée. C'est ce que je suis venu avec: p> Donc, lorsqu'un jeu de données est mis en file d'attente, les evenargs transmettront une table en déséquilibre à l'abonné de l'événement. Cette implémentation me fournira-t-elle une file d'attente de sécurité? P> p> Concurrentqueue
5 Réponses :
Vous dérogeez vos objets lorsque vous les en faisez.
Vous devez soulever l'événement en utilisant votre paramètre. P>
Que ce soit en réalité, le thread-Safe dépend de la façon dont vous l'utilisez.
Si vous vérifiez jamais le nombre code> code> ou vérifiez le vide, ce n'est pas Threadsafe et ne peut pas être facilement fabriqué Threadsafe.
Si vous ne le faites pas, vous pouvez probablement utiliser quelque chose de plus simple qu'une file d'attente. P>
L'Enqueue devrait être plus rapide que la désieue (toutefois, je n'ai pas encore de données pour confirmer de la manière). Enqueueing est également effectué sur le fil principal. Lorsque l'événement incendie, j'utilise une action begininvoke code> pour exécuter le processus de déséquilibre de manière asynchrone.
De plus ... je ne vérifie jamais compte code> et je n'ai pas vu de ne pas avoir besoin de le faire depuis que je déduit presque immédiatement sur un fil de travail. Je ne sais pas ce qui serait plus simple qu'une file d'attente
On dirait que vous n'avez pas besoin d'une file d'attente du tout; Vous pouvez simplement transmettre la table sous forme de paramètre sur begininvoke code>.
@Aiabstract Je vous souhaitiez créer un événement à soulever sur la file d'attente de l'article (article arrivé), vous pouvez le faire en créant un événement personnalisé EventHandler. Ci-dessous, il y a un exemple utilisant net 3.5: experts-exchange.com/questions/28768639/... a>
Un voyage rapide sur mon moteur de recherche préféré a révélé que ma mémoire était correcte; Vous pouvez obtenir la bibliothèque parallèle de tâche même sur .NET 3.5 A >. Voir également Le blog de l'équipe PFX sur le sujet a >, et le Extensions réactives que vous téléchargez pour obtenir au souhaité system.threading.dll code>. p>
Malheureusement, je suis lié (par politique interne) aux bibliothèques de base utilisées dans .NET 3.5 - Conservez essentiellement tous les développeurs à l'aide des mêmes bibliothèques. Si j'essaie d'utiliser TPLIB, je serai marqué comme un voyou. Sinon, une bonne option.
C'est une politique insane i>. Re-inventer la roue est l'une des pires drains de productivité et une excellente source de bugs.
Ce type de politique est généralement appliqué par des personnes qui ne connaissent rien de la programmation ...
En fait, la politique a du sens lorsque le CTP n'est plus disponible et que les extensions réactives sont non prises en charge i>.
Dans la ligne Utilisez Peek au lieu de Dequue P>
Il devrait être p>
AurdeChaseUée (Nouveau TableQuuedeventargs (Dequeue ())); Code> Dans votre
Enqueue code> Méthode P>
prononcé (Nouveau Tatégories de tableEquentargs (base.eek ())); code> p>
Le fait que vous devez utiliser Voici une simple file d'attente synchronisée, qui ne fait pas "T Utilisez l'héritage mais repose toujours sur le comportement de la norme nouveau code> pour masquer les méthodes à partir de la classe de base est généralement une indication que vous devez utiliser la composition plutôt que sur l'héritage ...
file d'attente
Quoi pour la mise en œuvre explicite d'interface et jeté sur _QUEUE?
verrouillage code> -ing dans un itérateur est dangereux.
Normalement, je ne tirerais pas une classe où j'utiliserais alors nouveau code> sur une méthode. Mais je ne voulais pas réécrire un tas de méthodes fournies par la base. Depuis que je savais que je ne voudrais remplacer que 2 des méthodes, aucun préjudice. Tous les méthodes et propriétés de base code> code> sont disponibles sans aucun effort supplémentaire de ma part. Si ma pensée est fausse, j'aimerais alors une explication quant à la raison pour laquelle je ne devrais pas dériver mon propre concurrentqueur
@Slaks, je suis d'accord que c'est se sent i> mal, mais je ne peux pas mettre mon doigt exactement pourquoi il est "dangereux" ... pourriez-vous élaborer?
@dbboarman, c'est correct tant que vous utilisez votre classe via une variable de ce type. Mais si vous l'utilisez via une variable de type file d'attente
neuves code> ne seront pas appelées
@THOMAS: Le verrouillage ne sera libéré que lorsque vous disposez () code> itérateur
ienumerator
@Slaks, c'est précisément ce que j'ai voulu ... mais je me rends compte que cela peut être un problème. D'autre part, si vous ne verrouillez pas pendant l'énumération, un autre thread peut modifier la collection, invalidant l'énumérateur. Je ne suis pas sûr qui est pire ...
@THOMAS: J'ai décidé de quitter la catégorie
Un peu de temps après la question initiale, je sais (cela est arrivé comme "associé" à droite d'une autre question), mais je suis allé avec ce qui suit dans des cas similaires. Pas aussi bon pour l'utilisation de la CPU-cache comme cela pourrait être, mais simple, sans verrouillage, le fil-coffre-fort et souvent de la CPU-cache-utilisation n'est pas si important s'il y avait souvent de grandes lacunes entre les opérations, et quand La proximité de l'allocation pourrait ne pas réduire l'impact:
que code> est totalement i> inutile. Vous devez verrouiller sur une touche d'objet
loadonly = nouvel objet (); code>.
@Slaks: j'ai implémenté
icollection que code> et
verrouillage (que.sycroot) code> en fonction de MSDN: msdn.microsoft.com/en-us/library/bb344892.aspx
Vous n'en avez pas besoin du tout.
Syncroot code> est utile si vous avez des morceaux de code disjoints qui doivent être verrouillés pour la même collection. Dans votre cas,
que code> est
null code>. Vous avez juste besoin de verrouiller un seul objet dans vos méthodes.
Je ne vois pas pourquoi vous essayez d'utiliser une file d'attente ici, car elle désigne immédiatement le même thread. Si vous souhaitez avoir des threads de travailleurs, vous pouvez utiliser un motif de file d'attente de producteur / consommateur. Il y a beaucoup d'exemples à ce sujet. De plus, je suppose que cela jette une exception nullreference dès que vous en faisez en conclusion.