Announcement

Collapse
No announcement yet.

Events werden 2x gefeuert. Why?

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

  • Events werden 2x gefeuert. Why?

    Hallo

    leider hat Google mir diesmal nicht weiterhelfen können.

    Folgendes:
    Ein View und ein Controller. Der View löst das Event aus, der Controller empfängt es. Viel hilft viel, in diesem Fall fände ich einen einmaligen Empfang effizienter.

    Code:
    View:
    public event EventHandler Calculate;
    internal void OnCalculate()
    {
      if (this.Calculate != null)
      {
        Calculate(this, EventArgs.Empty); 
      }                
    }
        
    Controller:
    view.Calculate += new EventHandler(DoCalculate);
    private void DoCalculate(object sender, EventArgs e)
    {            
      //Do something
    }
    Wird das Event im Controller nicht registriert (also ich hab es mal Testweise auskommentiert), wird es logischerweise nicht gefeuert. Wo liegt der (Denk-)Fehler?? Danke für Hilfe.

    Vorerst habe ich mich behelfsmässig mit folgendem Code vor dem "Do Something" versorgt, jedoch nervig und unübersichtlicher, wenn man das nun bei jedem Event einfügt.

    Code:
    firedTwiceEventHelper = !firedTwiceEventHelper;
    if (firedTwiceEventHelper)
    {                
        return;
    }
    Hat jemand Ideen oder Lösungen?
    Gruss
    sci

  • #2
    Hallo,

    bei folgenden Beispiel wird es nur 1x gefeuert:

    [highlight=c#]
    using System;

    namespace ConsoleApplication1
    {
    class Program
    {
    static void Main(string[] args)
    {
    View view = new View();
    Controller cr = new Controller(view);
    view.OnCalculate();
    Console.ReadKey();
    }
    }

    public class View
    {
    public event EventHandler Calculate;

    internal void OnCalculate()
    {
    EventHandler tmp = Calculate;
    if (tmp != null)
    tmp(this, EventArgs.Empty);
    }
    }

    public class Controller
    {
    private View view;

    public Controller(View view)
    {
    this.view = view;
    this.view.Calculate += new EventHandler(view_Calculate);
    }

    void view_Calculate(object sender, EventArgs e)
    {
    Console.WriteLine("sdklfs");
    }
    }
    }
    [/highlight]

    Es spielt auch keine Rolle ob der EventHandler zuerst temporär zwischengespeichert wird (wegen Threadsicherheit).

    Vermutlich liegt bei dir irgendein Nebeneffekt vor. Probier mal den Eventhandler thraedsicher zu machen wie im Beispiel bei Zeile 22...24.

    Kannst du mehr Code posten - denn das gezeigte ist korrket.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Wird das Event im Controller nicht registriert (also ich hab es mal Testweise auskommentiert), wird es logischerweise nicht gefeuert. Wo liegt der (Denk-)Fehler?? Danke für Hilfe.
      Die Codezeile der Registrierung, also

      Code:
      view.Calculate += new EventHandler(DoCalculate);
      wird 2*mal ausgeführt? Ohne mehr Code von dir für uns aber nicht zu beantworten. Übrigens es tut auch ein einfaches

      Code:
      view.Calculate += DoCalculate;

      Comment


      • #4
        Übrigens es tut auch ein einfaches
        Code:
        view.Calculate += DoCalculate;
        Da merke ich noch an dass so auch Lambda-Aurdrücke verwendet werden können. ZB
        [highlight=c#]
        button1.Click +=
        (sender, e) => MessageBox.Show("Test");
        [/highlight]

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hallo,

          besten Dank für die Unterstützung. Der Source läuft korrekt und der Fehler liegt beim Programmierer, in diesem Fall in. War wohl gestern ein wenig zu spät, um den Überblick über den Source zu behalten Die Software ist ein wenig komplexer (Interop, Interfaces und Co), die ich zur Vereinfachung auf das Wesentliche reduzierte.

          Der View ist eine abgeleitete UserControl Klasse und das Event Calculate wird bei einem Button-Click ausgelöst. Alle Events des Views werden durch einer Methode SubscribeView im Controller registriert.

          Und hier lag der Fehler: DUMMERWEISE hatte ich die Methode SubscribeView 2x im Source aufgerufen. Mir war nicht bewusst und ist der Sinn verborgen, dass Events mehr als einmal registriert werden können. Bestimmt mag es ein sinnvolles Szenario für diesen Fall geben, wenn mir auch keines einfällt.

          MFG
          sci

          Comment


          • #6
            dass Events mehr als einmal registriert werden können.
            Events sind letzlich nichts anderes als Delegaten und diese können kombiniert werden.

            Bestimmt mag es ein sinnvolles Szenario für diesen Fall geben, wenn mir auch keines einfällt.
            Es gibt sinnvolle Möglichkeiten.

            zB
            • in einem Diagramm soll der Klick auf eine Datenreihe oder der Klick auf das entsprechende Legendensymbol eine Aktion durchführen -> beide Klicks werden dem gleichen Ereignishandler zugewiesen
            • in LINQ können durch Kombination der Delegaten Abfragen teilweise einfacher geschrieben werden


            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment

            Working...
            X