Question

J'ai une collection personnalisée (un ObservableQueue thread-safe). Je mis en œuvre la logique métier dans la classe de collection (à savoir dequeue les éléments d'un par un et les exposer à l'extérieur). Cela fonctionne très bien. Pour éviter la collecte de bloquer le fil il est initialisée, les outils OnservableQueue un thread pour effectuer ce travail. Maintenant, je ne suis pas tout à fait sûr de tous les pièges qui pourraient se produire.

Est-ce une mauvaise idée de Initialiser (ne démarre pas! Ne Initialiser) le fil dans le constructeur? Et ce serait une bonne, sinon meilleure, la pratique de mettre fin au fil? Remarque, je ne besoin de savoir comment mettre fin à un fil, qui fonctionne bien, je suis plutôt intéressé par temps il y a quelque chose de mal faire en utilisant le modèle jetable ou la création d'une méthode qui aurait besoin d'obtenir appelé à mettre fin au fil. Si la mise en œuvre IDisposable ce qu'il ya des choses que je dois prendre en compte en ce qui concerne la collecte / file d'attente?

Modifier Le fil est en fait seulement pré-initialisés pour empêcher NullReferenceException d'être jeté dans la méthode Enqueue, où il est bien initilised à nouveau (la méthode Enqueue est censé vérifier la météo un fil dequeuing est déjà en cours d'exécution et si ne pas commencer une nouvelle). Notez que lorsque tous les éléments sont dequeued et le fil a fait son travail, il ne sera pas en vie plus longtemps non plus, donc chaque fois que la file d'attente est vide et un nouvel élément est ajouté un nouveau thread allons commencer à traiter la file d'attente:

if (!_dequeuingThread.IsAlive)
{
    // start the dequeuing thread
    _dequeuingThread = new Thread(new ThreadStart(StartDequeuing));
    _dequeuingThread.Name = "DeQueueThread";
    _dequeuingThread.Start();
}

if n'a pas besoin d'un fil initialisés. Il existe d'autres moyens possibles pour y parvenir, mais pré-initialisant le fil semblait le moins gênant. Vous voyez que après avoir vérifié temps le fil est vivant, qu'il ne doit pas être en pré-initialisées, il s'initialisés à nouveau correctement.

Était-ce utile?

La solution

Je ne vois rien de mal avec initialisant dans le constructeur, mais il est évident à nu à l'esprit qu'ils seront initialisés dans un autre thread que votre thread de travail.

En ce qui concerne l'arrêt, j'ai généralement un indicateur booléen volatile que les contrôles des travailleurs de continuer à courir. Si vos sommeils de fil des travailleurs du tout, ont ensuite attendre un événement plutôt que de dormir, de sorte que vous pouvez le réveiller immédiatement quand arrêter.

Autres conseils

Il semble y avoir un problème avec le fait que le consommateur va initialiser cet objet de collection en appelant son constructeur et il penserait que l'objet est initialisé (que ce que le constructeur est censé faire), ce qui est inexact comme l'initialisation se produit sur un fil séparé créée par le constructeur. Donc, en gros vous avez besoin de mettre en œuvre une sorte de « API Asynchronous sur cet objet » pour initialiser cette collection telle que le consommateur appelle la méthode initialize (après avoir créé l'objet en utilisant constructeur) puis soit par le passage d'un rappel à la méthode d'initialisation ou en vous inscrivant à un événement sur l'objet de collection le consommateur obtient de savoir que l'initialisation est terminée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top