Announcement

Collapse
No announcement yet.

Delegate in andere Klasse aufrufen/ Multicast Delegates

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

  • Delegate in andere Klasse aufrufen/ Multicast Delegates

    Hallo zusammen,

    ich habe folgendes Problem und bin mir nicht ganz sicher ob meine Vorgehensweise korrekt ist, bzw.
    ob delegates überhaupt die Lösung sind.

    Ich habe eine Klasse HandleEvent und eine Klasse Process... Jedes mal wenn die Methode
    OnRead in Klasse HandleEvents aufgerufen wird, sollte die Info in der Klasse
    Process upgedatet werden... jedoch will ich kein Instance von der Klasse HandleEvents in Klasse Process erzeugen, denn nach meine Architektur gibt es keine direkte beziehung zwischen die beiden Klassen..
    log hat den Wert null in der Klasse HandelEvents auch wenn ich den Event als static declariere

    HandleEvents

    C#-Code:
    Code:
        public delegate void Progre(string info);
    
        public class HandleEvents
        {
    
            //public delegate void Progre(string info);
            public event Progre log;
    
            public void OnRead(object sender, TransferEventArgs e)
            {
               Console.WriteLine("Transfer: {0} - Read: {1}:{2}", e.TransferDate, e.TransferName, e.FileName);
                if (log != null)
                {
                    log(String.Format("Sender Object: {0} - Read: {1}:{2}", sender.GetType(), e.TransferName, e.FileName));
                }         }
          }
    Kalsse Process

    C#-Code:
    Code:
        public class Process
        {
           public void Ausgabe(string info)
            {
                Console.WriteLine("--------------------------------------------------" +info );
            }
            /// <summary>
            /// Start and Initialize the Process
            /// </summary>
            private void StartInit()
            {
    
                Progre log = Ausgabe;
                log += Ausgabe;
             }
        }
    Danke im Vorraus

  • #2
    Wenn du den Event statisch machst und dann auch den Event darüber registrierst

    Code:
    public void StartInit()
    {
        HandleEvents.log += Ausgabe;                
    }
    sollte es funktionieren.


    PS.Du solltest keine Klasse so benennen wie eine aus dem Framework. Oder überhaupt eine andere Klasse in einem anderen Namespace.

    Comment


    • #3
      Ok danke, ich habe jetzt den Nmaen zu HandleTransferEvents geändert,
      Klasse Process
      Code:
              private void StartInit()
              {
                  Transfer.HandleTransferEvents.log += Ausgabe; 
               }
      Klasse HandleTransferEvents

      Code:
      static event Progre log
      log wird in der Klasse Process nicht erkannt
      Der Zugriff ist aufgrund der Sicherheitsebene nicht möglich

      Comment


      • #4
        Ohne Sichtbarkeit ist der log Member erstmal privat. Solltest also noch public vor static schreiben.

        PS. Events würde man auch eher groß schreiben (Log)

        Comment


        • #5
          Danke es funktioniert
          noch eine Frage: Es gibt ein gefahr dass statische Events zu "Memory Leaks" fuehren könnten, Ich will es in ein großen Project benutzen, kann es später zu große Probleme Führen?

          Comment


          • #6
            Du musst sauber dafür sorgen das alle Klassen die HandleTransferEvents zum loggen benutzen am Ende auch wieder ihren Log Event abhängen sonst werden alle diese Klasse nicht zerstört(HandleTransferEvents hätte über den Delegaten ja noch eine Referenz auf diese Klassen). Das hat aber jetzt nur indirekt was mit static zu tun. Das könnte dir genauso bei einem langlebigen anderen (nicht static) Object passieren.

            Warum benutzt du den überhaupt einen Delegaten und rufst nicht einfach von dort wo du loggen willst einfach eine statische Methode auf?

            Comment

            Working...
            X