Ich habe oft die Notwendigkeit, eine Warteschlange von Elementen zu verarbeiten, bei denen kein Benutzer die Warteschlange blockieren darf und die Elemente in der Warteschlange in einer bestimmten Reihenfolge verarbeitet werden sollen. Ich schreibe häufig eine Klasse, um das zu tun, aber ich dachte, es sollte eine generische Version geben, aber ich kann keine finden.Generische C# Round Robin (partitioniert/sortiert) Warteschlange
Also ich bin auf der Suche nach einer Queue-Klasse, wo ich einen Typ, einen Selektor für Partitionen und einen Selektor zur Bestellung angeben kann, so dass ich Objekte zur Warteschlange hinzufügen kann und wenn ich Objekte wieder raus bekomme das erste Objekt von der nächsten Partition, die nach meinem Auftragsspezifizierer geordnet ist.
Zum Beispiel würde ich so nennen angibt, wie und zu partitionieren, wie die Warteschlange zu sortieren:
var queue = new RoundRobinQueue<Message>(
_ => _.UserID,
_ => _.SendDate
);
Und nachdem ich viele Botschaft des hinzugefügt habe, kann ich die Einzelteile in meiner Warteschlange und Prozess Parallel.ForEach
sie in der Reihenfolge der frühesten SendDate
für die nächste User
. Wenn also ein Benutzer langsam ist, blockieren seine Elemente die Warteschlange nicht, da er nur einen Thread erhält, aber wenn es nur einen Benutzer gibt, ist er die einzige Partition, so dass er alle Threads erhält.
Ich sah überall, aber konnte keine nette generische Implementierung in C# dafür finden. Irgendwelche Ideen?
foreach benötigt IEnumerable. Aber wie könnte foreach wissen, wann zu beenden, wenn diese Sammlung, eine Round-Robin-Warteschlange, immer als nächstes hat? Sie können erzwingen, es um eine Anzahl oder Zeitüberschreitung zu brechen. Aber die Benutzer dieser Klasse können verletzt werden, wenn sie es falsch benutzen, sogar Sie selbst. Z.B. Diese Warteschlange kann in Ihrem Code als IEnumerable umgangen werden und an eine Methode übergeben werden, die IEnumerable übernimmt und dafür sorgt, dass es funktioniert, Hoppla! – Ryan
Warum gibt es keine Erweiterungsmethode für IEnumerable, die einen Iterator zurückgibt? – PPC