Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[erledigt] Alternative für statische Events
Diräkt
myCSharp.de - Member



Dabei seit:
Beiträge: 622
Herkunft: Schweiz

Themenstarter:

[erledigt] Alternative für statische Events

beantworten | zitieren | melden

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:
Zitat 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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Diräkt am .
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
Diräkt
myCSharp.de - Member



Dabei seit:
Beiträge: 622
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Diräkt,
Zitat
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.
Zitat
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.
Zitat
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
private Nachricht | Beiträge des Benutzers
Diräkt
myCSharp.de - Member



Dabei seit:
Beiträge: 622
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Diräkt am .
private Nachricht | Beiträge des Benutzers