10
votes

Activation de la queue avec une concurrence

J'ai une précédente question que j'ai fourni ma solution; Cependant, je n'ai pas accès à Concurrentqueue depuis que je suis sur .NET 3.5. J'ai besoin d'une queue pour permettre la concurrence. J'ai lu cette Question et semble présenter un problème si un élément est Pas dans la file d'attente et la méthode filetée tente de déroger un élément.

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: xxx

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é?


4 commentaires

que est totalement inutile. Vous devez verrouiller sur une touche d'objet loadonly = nouvel objet (); .


@Slaks: j'ai implémenté icollection que et verrouillage (que.sycroot) en fonction de MSDN: msdn.microsoft.com/en-us/library/bb344892.aspx


Vous n'en avez pas besoin du tout. Syncroot est utile si vous avez des morceaux de code disjoints qui doivent être verrouillés pour la même collection. Dans votre cas, que est null . 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.


5 Réponses :


2
votes

Vous dérogeez vos objets lorsque vous les en faisez.
Vous devez soulever l'événement en utilisant votre paramètre.

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 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.


4 commentaires

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 pour exécuter le processus de déséquilibre de manière asynchrone.


De plus ... je ne vérifie jamais compte 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 sauf si je ne suis allé à une liste - que je faisais presque, mais la classe semblait avoir tout ce dont j'aurais besoin, sauf, bien sûr, pour l'événement lorsqu'un article est mis en 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 .


@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/...



3
votes

4 commentaires

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 . 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 .



0
votes

Dans la ligne AurdeChaseUée (Nouveau TableQuuedeventargs (Dequeue ())); Dans votre Enqueue Méthode

Utilisez Peek au lieu de Dequue

Il devrait être

prononcé (Nouveau Tatégories de tableEquentargs (base.eek ()));


0 commentaires

3
votes

Le fait que vous devez utiliser nouveau 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 ...

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 file d'attente : xxx


8 commentaires

Quoi pour la mise en œuvre explicite d'interface et jeté sur _QUEUE?


verrouillage -ing dans un itérateur est dangereux.


Normalement, je ne tirerais pas une classe où j'utiliserais alors nouveau 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 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 de la queue .


@Slaks, je suis d'accord que c'est se sent 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 , vos méthodes neuves ne seront pas appelées


@THOMAS: Le verrouillage ne sera libéré que lorsque vous disposez () itérateur ienumerator . Stackoverflow.com/Questtions/2274664/...


@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 comme SLAWS suggéré: Stackoverflow.com/questions/4567656/...



2
votes

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: xxx


0 commentaires