Custom Eventhandler

Als erstens: Ich habe eine statische Konfigurationsklasse welche Einstellungen speichert oder schreibt. Auf diese Klasse greifen insgesamt etwa 3 Klassen zu und holen sich die Einstellungen bei Programmstart. Nun zum eigentlichen Problem.
Der User hat ja die Möglichkeit Einstellungen auch während der Laufzeit zu ändern, das bedeutet aber, dass wenn diese Änderungen erfolgt sind, die anderen Klassen davon etwas mitbekommen müssen, kein Problem dachte ich mir nach dieser Erklärung auf http://msdn.microsoft.com/de-de/library/w369ty8x(VS.80).aspx


Ich habe also oben meiner Konfigurationsklasse noch eine 2te reingepackt(ein eigenes file schin mier übertrieben), welche wie folgt aussieht.
Code:
    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string s)
        {
            message = s;
        }
        private string message;

        public string Message
        {
            get { return message; }
            set { message = value; }
        }
    }

Meinem ConfigurationReader habe ich folgendermassen erweitert (nur durch meinen Versuch hinzugefügtes, ist in dieser Klasse ersichtlich):
Code:
  class ConfigurationReader
    {
        public event EventHandler<CustomEventArgs> RaiseCustomEvent;

        protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
        {
            // Make a temporary copy of the event to avoid possibility of
            // a race condition if the last subscriber unsubscribes
            // immediately after the null check and before the event is raised.
            EventHandler<CustomEventArgs> handler = RaiseCustomEvent;

            // Event will be null if there are no subscribers
            if (handler != null)
            {
                // Format the string to send inside the CustomEventArgs parameter
                e.Message += String.Format(" at {0}", DateTime.Now.ToString());

                // Use the () operator to raise the event.
                handler(this, e);
            }
        }
        public void reload()
        {
            OnRaiseCustomEvent(new CustomEventArgs("Did something"));
        }

    }
}

Und bei allen Klassen die den ConfigurationReader benutzen abonniere ich folgendermassen das Event, welches mitteilt, dass die Konfigurationen neu geschrieben wurden.

Code:
            configReader = ConfigurationReader.GetInstance();
            configReader.RaiseCustomEvent += new EventHandler<CustomEventArgs>(readConfig);

Nur funktioniert das nun nicht so wie ich wollte, die readConfig Methode wird gar nicht aufgerufen. Ich denke dass es damit zu tun hat, dass es sich bei mir um eine statische Klasse handelt, aber ich finde den Fehler trozdem nicht.

Grüsse
 

Alexander Schuc

crazy-weasel
Hi.

Zuerst zu deinem eigenen Event: Benenn das doch gleich mal sinnvoll. "CustomEvent" sagt ja gar nichts aus. "SettingsChanged" klingt viel besser, meinst nicht? ;)

Deine CostumEventArgs kannst auch nochmal überdenken. Es sollte ausreichend sein, wenn du einfach die EventArgs verwendest. Deine "Message" Eigenschaft wirst ja nicht wirklich brauchen.

Eine statische Klasse hast übrigens auch nicht, sieht eher nach einem Singleton aus. Es kann sein, dass du den falsch implementiert hast, und deswegen mehrere Objekte über GetInstance erzeugst. Dann hättest du das Problem, dass du wahrscheinlcih bei einem anderen Objekt das Event auslöst, und dort kein Handler registriert ist.

Ansonsten, wenn alles richtig gemacht wurde, sollte beim Aufruf von "reload" bei deinem ConfigurationManager der Event ausgelöst werden.



lg, Alex
 
Hallo Alex,

danke für deine Antwort. In meinem Übereifer habe ich da etwas falsches geschrieben. Natürlich war und ist es ein Sigelton.

Die Name habe ich angepasst, - es waren immer noch die MSDN Standardnamen, denn zum aptippen war ich zu faul - und habe das Problem auch gleich gefunden. Ich hatte ja mehrere Klassen die sich den Eventhandler abonnierten, aber von diesen Klassen existierte noch kein Objekt. Ich habe diese Klassen eingeplant und deren Grundstruktur erstellt, aber nichts weiter.

Grüsse Daniel