J'ai une application qui a une ConcurrentQueue d'éléments qui ont une propriété ID et une ConcurrentQueue de tâches pour chaque élément, les éléments de file d'attente ressemblent:PFX ConcurrentQueue - est-il un moyen de supprimer un élément spécifique de la file d'attente
class QueueItem {
public int ID { get; set; }
public ConcurrentQueue<WorkItem> workItemQueue { get; set; }
}
et la file d'attente se ressemble:
ConcurrentQueue<QueueItem> itemQueue;
J'ai un fil faire un foreach sur la itemQueue, deQueueing un élément de chaque file d'attente et faire un travail sur elle:
foreach(var queueItem in itemQueue) {
WorkItem workItem;
if (queueItem.workItemQueue.TryDequeue(out workItem))
doWork(workItem);
else
// no more workItems for this queueItem
}
J'utilise ConcurrentQueues parce que j'ai un thread séparé qui ajoute potentiellement des queueItems à l'itemQueue et qui ajoute des workItems à chaque workItemQueue.
Mon problème vient quand je n'ai pas plus WorkItems dans un queueItem - Je voudrais supprimer cette queueItem du itemQueue - quelque chose comme ...
if (queueItem.workItemQueue.TryDequeue(out workItem))
doWork(workItem);
else
itemQueue.TryRemove(queueItem);
... mais je ne peux pas trouver un moyen de le faire facilement. La façon dont je suis venu avec est de dequeue chaque QueueItem puis Enqueue s'il y a WorkItems encore dans le workItemQueue:
for (int i = 0; i < itemQueue.Count; i++) {
QueueItem item;
itemQueue.TryDequeue(out queueItem);
if (queueItem.workItemQueue.TryDequeue(out workItem)) {
itemQueue.Enqueue(queueItem);
doWork(workItem);
}
else
break;
}
Y at-il une meilleure façon d'accomplir ce que je veux à l'aide du PFX ConcurrentQueue, ou est-ce Si vous utilisez une implémentation de liste/file d'attente simultanée personnalisée ou que je manque quelque chose, est-ce une manière raisonnable de le faire?
Aucune idée personnellement. Le nouveau type de PFX mais je suis surpris que personne n'ait répondu à votre question jusqu'à présent. – bounav