Zastanawiam się, jaka jest "najlepsza praktyka", gdy proszą osobę zajmującą się zdarzeniem o wypisanie się po odpaleniu raz.Czy anonimowy delegat może wypisać się z wydarzenia po jego zwolnieniu?
Dla kontekstu, to jest moja sytuacja. Użytkownik jest zalogowany i jest w stanie gotowości do obsługi pozycji roboczych. Otrzymują przedmiot pracy, przetwarzają go, a następnie wracają do stanu gotowości. W tym momencie mogą chcieć powiedzieć, że nie są dostępne dla większej liczby elementów pracy, ale mimo to jeden jest wysyłany do nich. To, co chcę robić, to pozwolić użytkownikowi na "kolejkowanie" "Nie jestem dostępny", jak tylko ta operacja stanie się możliwa.
public event SomeHandler StateChanged = delegate {};
public void QueueNotAvailable()
{
StateChanged += (s,e) => {
if (e.CanGoNotAvailable) {
someObject.NotAvailable();
StateChanged -= {thishandler};
}
}
}
Dla moich celów, jeśli osobny wątek dzieje się wystrzelić wydarzenia i ten konkretny obsługi biegnie dwa razy, to nie jest problem. Żądanie tej samej funkcji bardzo blisko siebie jest dopuszczalne. Po prostu nie chcę, aby strzelał za każdym razem, gdy operacja jest dozwolona.
To całkiem fajne, że może się odwoływać. Na pewno to, co mówisz, to "StateChanged - = null"? Musiałbyś również przechowywać handler'a w klasie, ponieważ zakładam, że OP chce zmienić stan StateChanged/handler, wykonując każde działanie handler'a. –
@Graphain: Miałem na myśli na linii 3, mam 'SomeHandler handler = null;' - Musiałem umieścić to na linii na własnej (zamiast przypisywania jej bezpośrednio do anonimowego delegata), ponieważ dostałem błąd kompilatora w przeciwnym razie. Nie musi to być członek klasy, ponieważ zamknięcie utworzone przez anonimowego delegata po prostu zrobi to za pomocą magii ... –
Zdaję sobie sprawę, że, ale mam na myśli w linii 5 (ignorowanie komentarza), handler istnieje jako null kiedy to tworzy. Chyba mamy szczęście, że kod nie zostanie wykonany, dopóki handler nie zostanie powiązany, więc nie jest to problem. Tak jak mam na myśli "a = null", wtedy "a = (a + 1)" jest w rzeczywistości "(a = (null + 1)" –