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?
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
Perché non un metodo di estensione a 'IEnumerable' che restituisce un Iterator? – PPC