Announcement

Collapse
No announcement yet.

Eigenes Event

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Eigenes Event

    Hallo,

    ich würde gerne ein eigenes Event schreiben, so wie das hier:

    Code:
    class Program
        {
            static void Main(string[] args)
            {
                Counter c = new Counter(new Random().Next(10));
                c.ThresholdReached += c_ThresholdReached;
    
                Console.WriteLine("press 'a' key to increase total");
                while (Console.ReadKey(true).KeyChar == 'a')
                {
                    Console.WriteLine("adding one");
                    c.Add(1);
                }
            }
    
            static void c_ThresholdReached(Object sender, ThresholdReachedEventArgs e)
            {
                Console.WriteLine("The threshold of {0} was reached at {1}.", e.Threshold, e.TimeReached);
                Environment.Exit(0);
            }
        }
    
        class Counter
        {
            private int threshold;
            private int total;
    
            public Counter(int passedThreshold)
            {
                threshold = passedThreshold;
            }
    
            public void Add(int x)
            {
                total += x;
                if (total >= threshold)
                {
                    ThresholdReachedEventArgs args = new ThresholdReachedEventArgs();
                    args.Threshold = threshold;
                    args.TimeReached = DateTime.Now;
                    OnThresholdReached(args);
                }
            }
    
            protected virtual void OnThresholdReached(ThresholdReachedEventArgs e)
            {
                ThresholdReachedEventHandler handler = ThresholdReached;
                if (handler != null)
                {
                    handler(this, e);
                }
            }
    
            public event ThresholdReachedEventHandler ThresholdReached;
        }
    
        public class ThresholdReachedEventArgs : EventArgs
        {
            public int Threshold { get; set; }
            public DateTime TimeReached { get; set; }
        }
    
        public delegate void ThresholdReachedEventHandler(Object sender, ThresholdReachedEventArgs e);
    Meine Frage: Wenn ich nun zusätzlich mit e.handled arbeiten möchte, müsste ich dieses doch hier setzen, oder:

    Code:
    protected virtual void OnThresholdReached(ThresholdReachedEventArgs e)
            {
                ThresholdReachedEventHandler handler = ThresholdReached;
                if (handler != null)
                {
                    handler(this, e);
    
                    if (e.handled == false)
    {
    // Tu noch was, sonst nicht
    }
                }
            }
    Das wäre schon die Frage... Danke!!

    MfG Flo
    Die Taschenlampe!

    Die perfekte Taschenlampe für Ihr Windows Phone!

    - Die APP steuert die echte Blitz-LED an und versorgt Sie mit 100% Leistung!
    - Zudem zeigt die Live-Kachel den aktuellen Akkustand des Telefons an!


    Hier gehts zu APP!

  • #2
    Kommt drauf an was du genau damit vorhast

    Was du bedenken solltest.
    Jemand könnte OnThresholdReached (Counter ist nicht sealed und die Methode virtuell) überschreiben wollen und dann ist entweder der Eventaufruf inkl. diesem Test weg oder er kann nur gemeinsam aufgerufen werden. Im Framework ist das Muster eigentlich immer so umgesetzt das der Aufrufer der OnMethode die einen Event wirft den potentiellen Return des Events prüft und nicht die OnMethode. Wenn man die überschreibt kommt man mit seinem zusätzlichem Code, ich gehe mal davon aus das man base.OnMethode üblichweise hier weiterhin aufruft, zwischen das ausführen des Events und dem prüfen des potentiellen returns des Events.

    Und alle Events,Delegates etc. sind ja Multicast Events. Was möchtest du das passiert wenn es mehrere Listener für diesen Event gibt? Soll nach jedem einzelnen Handler geprüft werden oder nach allen? In deinem Code testest du nach allen Listenern du würdest also nicht mitbekommen wenn zwischenzeitlich mal einer was anders gemeldet hat als der letzte ausgeführte Listener.

    Comment


    • #3
      Also sollte die e.handled-Eigenschaft in der "ADD"-Methode geprüft werden, richtig?

      Wie prüfe ich den nach jedem einzelnen Handler??

      MfG Flo
      Die Taschenlampe!

      Die perfekte Taschenlampe für Ihr Windows Phone!

      - Die APP steuert die echte Blitz-LED an und versorgt Sie mit 100% Leistung!
      - Zudem zeigt die Live-Kachel den aktuellen Akkustand des Telefons an!


      Hier gehts zu APP!

      Comment


      • #4
        Da wär es wohl am besten aufgehoben ja.

        Um die EventHandler einzeln aufzurufen kannst du die InvocationList des Handlers duchgehen einzeln aufrufen und eben einzeln testen.

        [Highlight=C#]ThresholdReachedEventHandler handler = ThresholdReached;
        if (handler != null)
        {
        foreach (ThresholdReachedEventHandler singleHandler in handler.GetInvocationList())
        {
        singleHandler (this, e);
        if (!e.Handled)
        {
        // Tu noch was, sonst nicht
        }
        }
        }[/Highlight]

        Comment


        • #5
          Supi, danke!

          Wenn du mir jetzt noch erklärst was genau für Vorteile das hat, bzw. wo ich das z.B. sinnvoll einsetzen kann wäre ich dankbar.. :-)

          MfG Flo
          Die Taschenlampe!

          Die perfekte Taschenlampe für Ihr Windows Phone!

          - Die APP steuert die echte Blitz-LED an und versorgt Sie mit 100% Leistung!
          - Zudem zeigt die Live-Kachel den aktuellen Akkustand des Telefons an!


          Hier gehts zu APP!

          Comment


          • #6
            sinnvoll ... hmmm.

            Also ich habs schon mal benutzt um in einer Multithreading Anwendung jeden einzelnen EventHandler in ~seinen~ Thread zu synchronisieren. Ob das sinnvoller ist als es im EventHandler selbst zu machen würde ich im nachhinein bezweifeln. Und ich habe es mal in einem Datenmodell benutzt wo es mehrere Provider von Businesslogik gab die sich an Events anheften können. Dort wollte ich verhindern das Exceptions in einem EventHandler das Ausführen der anderen EventHandler verhindert und habe da eben ein Exceptionhandling um die einzelnen Delegatenaufrufe gepackt. Für ein Cancelled/Handled etc. habe ich es jetzt selbst noch nicht gebraucht.

            Comment


            • #7
              Alles klar! Danke für Alles!!
              Die Taschenlampe!

              Die perfekte Taschenlampe für Ihr Windows Phone!

              - Die APP steuert die echte Blitz-LED an und versorgt Sie mit 100% Leistung!
              - Zudem zeigt die Live-Kachel den aktuellen Akkustand des Telefons an!


              Hier gehts zu APP!

              Comment


              • #8
                Eine Frage hätte ich noch: Auf dotnetframework.org kann man alle Klassen im Framework betrachten. Leider sehe ich in keiner wie z.B. Grundlegene Events verarbeitet werden. Also wann und wie e.Handled in einem RoutedEvent abgefragt wird.
                Was mich interessieren würde: Wie sieht das mit z.B. PreviewMouseDown, PreviewMouseUp, Click aus? Kann ich mir das vereinfacht so vorstellen:


                private bool _MousewasDown;

                void LosGehts()
                {
                RaiseEvent(MouseUp);

                if (MouseUp.MouseOben && _MousewasDown && MouseUp.Handled == false)
                RaiseEvent(Click);
                }


                MfG Flo
                Die Taschenlampe!

                Die perfekte Taschenlampe für Ihr Windows Phone!

                - Die APP steuert die echte Blitz-LED an und versorgt Sie mit 100% Leistung!
                - Zudem zeigt die Live-Kachel den aktuellen Akkustand des Telefons an!


                Hier gehts zu APP!

                Comment


                • #9
                  Falls es Dich tatsächlich interessiert kannst Du Dir auch anschauen wie Microsoft so etwas implementiert hat. Hol Dir einen decompiler und schau Dir die Sourcen von Microsoft an:

                  http://www.jetbrains.com/decompiler/

                  Allerdings sollte man dazu sagen dass das offiziell nicht erlaubt ist. Und man natürlich die Sourcen unter keinen Umständen verändern und nochmal kompilieren sollte.

                  Comment


                  • #10
                    Allerdings sollte man dazu sagen dass das offiziell nicht erlaubt ist.
                    Dann ist also der ganze Source Code/Debug Symbole den man auf http://referencesource.microsoft.com/ bekommt illegal?

                    Comment

                    Working...
                    X