2010-06-21 6 views
16

Ich frage mich, was die "Best Practice" ist, wenn ein Event-Handler sich selbst nach einmaligem Abfeuern abbestellen.Kann ein anonymer Delegierter sich von einem Ereignis abmelden, nachdem es ausgelöst wurde?

Für den Kontext ist dies meine Situation. Ein Benutzer ist angemeldet und befindet sich in einem Bereitschaftszustand, um Arbeitselemente zu behandeln. Sie erhalten ein Arbeitselement, verarbeiten es und gehen dann wieder in den Bereitschaftszustand zurück. An dieser Stelle möchten sie vielleicht sagen, dass sie für weitere Arbeitsaufgaben nicht verfügbar sind, aber eine wird ihnen trotzdem gesendet. Was ich tun möchte, ist es dem Benutzer zu ermöglichen, ein "Ich bin nicht verfügbar" zu "queueren", sobald dieser Vorgang möglich wird.

Für meine Zwecke, wenn ein separater Thread die Ereignisse auslöst und dieser spezielle Handler zweimal ausgeführt wird, ist dies kein Problem. Es ist akzeptabel, die gleiche Funktion sehr nahe beieinander anzufragen. Ich will nur nicht, dass es jedes Mal zündet, wenn die Operation erlaubt ist.

Antwort

39

Sie können auf das Ereignis vor der Zeichnung eine Instanz des Delegaten sparen:

public void QueueNotAvailable() 
{ 
    SomeHandler handler = null; 
    handler = (s,e) { 
     // ... 
     StateChanged -= handler; 
    }; 
    StateChanged += handler; 
} 

Ich glaube, das sollte es tun ... Ich hatte sonst dort die anfängliche handler = null setzen Sie ‚Verwendung von nicht zugeordneten erhalten lokale Variablen 'Kompilierungsfehler, aber ich denke, es ist tatsächlich gutartig.

+0

Das ist ziemlich cool, dass es sich selbst referenzieren kann. Sicher, was Sie dort sagen, ist "StateChanged - = null"? Sie müssten den Handler auch in einem Mitglied auf Klassenebene speichern, da ich annahm, dass das OP den Status StateChanged/handler bei jeder Ausführung des Handlers ändern möchte. –

+0

@Graphain: Ich meinte in Zeile 3, ich habe 'SomeHandler handler = null;' - Ich musste das auf eine eigene Zeile setzen (anstatt es direkt dem anonymen Delegaten zuzuweisen), weil sonst ein Compilerfehler kam. Es muss kein Mitglied auf Klassenebene sein, da die Schließung, die vom anonymen Delegierten erstellt wird, einfach nur Magie ist ... –

+0

Das ist mir klar, aber ich meine, in Zeile 5 (Kommentar ignorieren) würde Handler als Null existieren wenn es es schafft. Ich nehme an, wir haben Glück, dass der Code erst ausgeführt wird, wenn der Handler gebunden ist, also ist das kein Problem. Wie ich meine "a = null" dann ist "a = (a + 1)" eigentlich "(a = (null + 1)" –

Verwandte Themen