anonymisierter Methoden-handler mittels Delegaten und invoke
-
wieso klappt diese konstruktion nicht?
//main.cs _abc._RecordFlashProgress += Invoke(new MethodInvoker(delegate(int CurrentCount, int MaxCount) { ; }));
definiert ist RecordFlashProgress so:
//abc.cs public delegate void RecordProgress(int CurrentCount, int MaxCount); public event RecordProgress _RecordFlashProgress;
ich weiss normalerweise würde ich eine eigene methode, die vom aufbau her zum delegaten passt, definieren, aber ich würde es gerne in einer zeile hinbekommen, denn ohne invoke geht es ja auch!
danke
-
Naja du verwechselst hier zwei Sachen.
Einmal das anmelden am Event und das direkte Ausführen. Invoke führt eine Methode aus, und du willst das direkt beim Anmelden am Event machen, klar das das nich funktioniert
-
MethodInvoker ist nur ein spezieller delegate für Methoden ohne Parameter und Rückgabewert (void).
Du hast aber explizit RecordProgress definiert, also:_abc._RecordFlashProgress += new RecordProgress(delegate(int CurrentCount, int MaxCount) { ; }); // bzw. kurz mittels Lamda-Ausdruck: _abc._RecordFlashProgress += (CurrentCount, MaxCount) => { ; };
Und wie @firefighter schon geschrieben hat, Invoke() erst beim Aufruf des Events verwenden...
P.S. Benutze für C#-Code die [ cs ] ... [ /cs ] Tags hier im Forum...
-
ja stimmt merke es gerade selbst das es schwachsinnig ist, hätte nur mal intensiver die msdn lesen sollen.
heisst also, das ich wenn ich synchronisieren will mittels invoke, auf jeden Fall eine Methode die zum delegaten passt erstellen muss?!
-
direkt noch eine frage: Kann ich folgende Schreibweise irgendwie verkürzen, zb. die Methode RecordSentEvent irgendwie mit in die 2. Zeile einbinden?
public delegate void RecordFlashProgress(); public event RecordFlashProgress _RecordFlashProgress; // würde gerne die obere zeile und den unteren Methodenaufruf verkürzt darstellen, ist das möglich? public void RecordSentEvent() { if (_RecordFlashProgress != null) { _RecordFlashProgress(); } }
-
wanderameise schrieb:
heisst also, das ich wenn ich synchronisieren will mittels invoke, auf jeden Fall eine Methode die zum delegaten passt erstellen muss?!
Ich muss sagen, dass ich nicht ganz verstehe, was du hier fragen möchtest. Was meinst du in diesem Kontext mit synchronisieren?
wanderameise schrieb:
direkt noch eine frage: Kann ich folgende Schreibweise irgendwie verkürzen, zb. die Methode RecordSentEvent irgendwie mit in die 2. Zeile einbinden?
public delegate void RecordFlashProgress(); public event RecordFlashProgress _RecordFlashProgress; // würde gerne die obere zeile und den unteren Methodenaufruf verkürzt darstellen, ist das möglich? public void RecordSentEvent() { if (_RecordFlashProgress != null) { _RecordFlashProgress(); } }
Nein: http://blogs.msdn.com/b/csharpfaq/archive/2004/03/19/93082.aspx
Es gibt allerdigns einen Workaround. Man kann einfach immer bereits einen no-op Handler zuweisen. Also:
public delegate void RecordFlashProgress(); public event RecordFlashProgress _RecordFlashProgress = delegate{}; // No-op Handler ^^^^^^^^^^ public void RecordSentEvent() { _RecordFlashProgress(); }
Grüssli