Ich habe eine Erzeuger/Verbraucher-Warteschlange, außer dass es bestimmte Arten von Objekten gibt. So kann nicht jeder Verbraucher ein hinzugefügtes Objekt konsumieren. Ich möchte nicht für jeden Typ eine bestimmte Warteschlange erstellen, da es zu viele gibt. (Es dehnt die Definition von Erzeuger/Verbraucher aus, aber ich bin nicht sicher, was der richtige Begriff ist.)C# Produzent/Verbraucher/Beobachter?
Gibt es so etwas wie eine EventWaitHandle, die Impulse mit einem Parameter ermöglicht? z.B. myHandle.Set(AddedType = "foo")
. Im Moment benutze ich Monitor.Wait
und dann überprüft jeder Verbraucher, ob der Puls tatsächlich für sie bestimmt war, aber das scheint sinnlos.
A pseduocode Version von dem, was ich habe jetzt:
class MyWorker {
public string MyType {get; set;}
public static Dictionary<string, MyInfo> data;
public static void DoWork(){
while(true){
if(Monitor.Wait(data, timeout)){
if (data.ContainsKey(MyType)){
// OK, do work
}
}
}
}
}
Wie Sie sehen können, könnte ich Impulse erhalten, wenn andere Sachen zum dict hinzugefügt wird. Es ist mir egal, wenn MyType dem Diktat hinzugefügt wird. Gibt es eine Möglichkeit, das zu tun? Es ist keine große Sache, aber zum Beispiel muss ich jetzt Timeouts manuell behandeln, weil jeder Zugriff auf die Sperre innerhalb des Timeouts erfolgreich sein kann, aber MyType
wird nie innerhalb von timeout
dem Diktat hinzugefügt.
Nur eine Idee, könnte jeder Objekttyp sein eigenes Sperrobjekt haben, so dass Sie das entsprechende Objekt "überwachen" können? –
@deltreme: Ja, das ist möglich, aber ich möchte kein neues Objekt für jeden Typ erstellen. – Xodarap
Ich bin mir nicht sicher, was Sie meinen, da es zu viele Typen gibt, um separate Warteschlangen für jeden zu erstellen. Wie das? Es ist der natürliche Weg, dies zu tun, und ich bin mir nicht sicher, wie viele separate Warteschlangen weniger effizient wären als jeder andere Mechanismus zur Handhabung von Ereignissen. –