Laden...

[erledigt] Alternative für statische Events

Erstellt von Diräkt vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.765 Views
D
Diräkt Themenstarter:in
615 Beiträge seit 2009
vor 11 Jahren
[erledigt] Alternative für statische Events

Hallo 😃

Problem:
Ich muss Informationen welche eine (leider) statische Methode bietet an Ihre subscriper weiterreichen können.

Idee:
Ich erstelle ein Event welches aboniert werden kann.


 public static event EventHandler<EventArgs<string>> PromptResultRecived;

Unschön
Statische Events sind sehr hässlich, da der GC solange das Event nicht un-subscript wird, einen Verweis auf den subscriper hat => Memory-Leaks, etc...

[EDIT]Achtung diese Behauptung von mir ist falsch, hier die Erklärung von Herbivore:

die Invocation List eines MulticastDelegaten liefert eine Liste von SingleCast-Delegaten. Jeder SingleCast-Delegat hat die Degegate.Target-Property, die auf den jeweiligen Subscriber zeigt. Bei statischen Delegaten ist diese aber gerade null, so dass gerade kein Leak entsteht. [/EDIT]

Das heisst man müsste das Event immer wieder unsubscripen.

Hat jemand eine Idee wie man das besser lösen kann ?

Beste Grüsse

Diräkt

G
538 Beiträge seit 2008
vor 11 Jahren

Du könntest nach dem Singleton-Pattern eine Klasse gestalten, die normale Events beinhaltet.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

6.911 Beiträge seit 2009
vor 11 Jahren

Hallo Grumbler85,

beim Singleton hast du auch eine "statische Referenz" auf das Objekt, insofern ändert das nicht viel.

Hallo Diräkt,

schau dir mal Weakevents an.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

D
Diräkt Themenstarter:in
615 Beiträge seit 2009
vor 11 Jahren

Hallo Gfoidl

Danke für die Idee bezüglich Weak Events! Sieht echt interssant aus...

Das Event wird nur aboniert, wenn es auch "sofort" ausgelöst wird.** Es gibt jeweils maximal ein registrierter Event-Handler.**


public static void VerifyPromptResult(string para)
        {
            if (PromptResultRecived != null)
            {
                var args = PromptResultRecived.CreateArgs(para);
                PromptResultRecived(null, args);
                PromptResultRecived = null;
            }
        }

Nach dem ich das Event auslöse, resette ich alle Handler. Ist das Dirty ? Gibts da schlaueres ?

Beste Grüsse

Diräkt

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo Diräkt,

Das Event wird nur aboniert, wenn es auch "sofort" ausgelöst wird. Es gibt jeweils maximal ein registrierter Event-Handler. [...] Nach dem ich das Event auslöse, resette ich alle Handler.

das klingt mir nach einer sehr umständlichen Implementierung von Polling.

Ist das Dirty ?

Ja, es ist vollkommen unüblich, dass ein Event nur einmal für einen EventHandler gefeuert wird und der EventHandler dann sofort wieder entfernt wird. Das könnte man schon als Missbrauch des Event-Pattern ansehen.

Gibts da schlaueres ?

Wenn wirklich alle drei Sätze/Bedingungen stimmen, dann könnte die Klasse stattdessen eine einfach Methode anbieten, die den String para als Rückgabewert liefert (oder null, wenn gerade kein "Event" ansteht). Der "Subscriber" würde dann die Methode einfach aufrufen und schauen, ob der String null ist und wenn nicht den Code ausführen, der sonst im EventHandler stehen würde.

herbivore

D
Diräkt Themenstarter:in
615 Beiträge seit 2009
vor 11 Jahren

Hallo Herbivore

Danke für Deine Antwort. Nur den Rückgabe-Wert auslesen kann ich leider nicht, da ich nicht weiss (zeitlich) wann dieser zur Verfügung steht.

Es hat mich aber auf den richtigen Pfad gebracht :
=> Eigentlich brauch ich eine Vritual Static Method was aber nicht existiert und der Sinn davon auch fraglich ist

Lösung :
=> Die Implementation von Virtual Static Method kann man mittels einem DELEGATE lösen.

Beste Grüsse und besten Dank

Diräkt