Mam kolejkę producenta/konsumenta, z wyjątkiem tego, że istnieją określone typy obiektów. Więc nie tylko każdy konsument może spożywać dodany obiekt. Nie chcę tworzyć specyficznej kolejki dla każdego typu, ponieważ jest ich zbyt wiele. (W pewnym sensie rozciąga się definicja producenta/konsumenta, ale nie jestem pewien, jaki jest właściwy termin.)C# producent/konsument/obserwator?
Czy istnieje coś takiego jak EventWaitHandle, która pozwala na impulsy z parametrem? na przykład myHandle.Set(AddedType = "foo")
. Teraz używam Monitor.Wait
, a następnie każdy konsument sprawdza, czy puls rzeczywiście był dla nich przeznaczony, ale wydaje się to bezsensowne.
Wersja pseduocode co mam teraz:
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
}
}
}
}
}
Jak widać, mogę dostać impulsy gdy inny materiał zostanie dodany do dict. Zastanawiam się tylko, kiedy MyType zostanie dodany do dyktatury. Czy jest jakiś sposób na zrobienie tego? Nie jest to wielka sprawa, ale na przykład muszę ręcznie obsłużyć limity czasu, ponieważ każde wejście blokady może zakończyć się w określonym czasie, ale MyType
nigdy nie jest dodawane do dyktatury w ramach timeout
.
Po prostu pomysł, czy każdy typ obiektu może mieć własny obiekt blokady, więc można "Monitorować" odpowiedni obiekt? –
@deltreme: tak, to możliwe, ale nie chcę tworzyć nowego obiektu dla każdego typu. – Xodarap
Nie jestem pewien, co masz na myśli, ponieważ istnieje zbyt wiele typów, aby utworzyć osobne kolejki dla każdego z nich. Jak to? To naturalny sposób, aby to zrobić, i nie jestem pewien, jak posiadanie wielu oddzielnych kolejek byłoby mniej wydajne niż jakikolwiek inny mechanizm obsługi zdarzeń. –