2012-12-19 13 views
6

Spesso ho la necessità di elaborare una coda di elementi in cui nessun utente dovrebbe essere in grado di bloccare la coda e gli elementi in coda dovrebbero essere elaborati in qualche ordine. Scrivo spesso una classe per farlo, ma ho pensato che ci dovrebbe essere una versione generica ma non riesco a trovarne una.C# Round Robin generico (partizionato/ordinato) Coda

Quindi sto cercando una classe di coda in cui è possibile specificare un tipo, un selettore per le partizioni e un selettore su cui effettuare l'ordine in modo da poter aggiungere oggetti alla coda e quindi quando riesco a recuperare gli oggetti, ottengo il primo oggetto dalla prossima partizione ordinato dal mio specificatore di ordine.

Per esempio, mi chiamerei come questo che specifica come partizionare e come ordinare la coda:

var queue = new RoundRobinQueue<Message>(
      _ => _.UserID, 
      _ => _.SendDate 
      ); 

E dopo che ho un sacco di messaggi di aggiunto, posso Parallel.ForEach gli articoli nel mio coda e di processo nell'ordine del primo SendDate per il prossimo User. In questo modo, se un utente è lento, i suoi elementi non bloccheranno la coda poiché ottiene solo un thread, ma se c'è un solo utente, è l'unica partizione in modo da ottenere tutti i thread.

Ho cercato ovunque ma non sono riuscito a trovare un'implementazione generica in C# per questo. Qualche idea?

+0

foreach ha bisogno di IEnumerable. Ma come si potrebbe sapere quando terminare se questa raccolta, una coda round robin, ha sempre il prossimo? Potresti forzare a romperlo con un conteggio o un timeout. Ma gli utenti di questa classe possono essere feriti se lo usano male, anche se stessi. Per esempio. questa coda può essere passata nel tuo codice come IEnumerable e passata a un metodo che prende qualsiasi IEnumerable e fa foreach su di esso, Oops! – Ryan

+0

Perché non un metodo di estensione a 'IEnumerable' che restituisce un Iterator? – PPC

risposta

-1

Guarda le classi definite in System.Collections.Concurrent. Esiste un ConcurrentQueue generico oltre a elementi di base per modelli produttore-consumatore.

Le classi e le interfacce disponibili sono riepilogate in MSDN.