Laden...

Event und Übergabeparameter

Erstellt von benji vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.736 Views
B
benji Themenstarter:in
6 Beiträge seit 2008
vor 15 Jahren
Event und Übergabeparameter

Guten Morgen zusammen!

Ich habe jetzt schon sämtliche Beiträge zum erstellen von eigenen Events durchgelesen aber ich werde irgendwie nicht schlau daraus bzw. war irgendwie nicht das richtige dabei.
Es geht um folgendes:

Ich habe einen Wlan-Handscanner der in einem Netzwerk arbeitet. Nun überwache ich den Rückgabewert eines Pings auf einen Server. Sobald sich dieser ändert, soll das Event ausgelöst werden.

Meine Frage, wie bekomme ich diesen Wert in den Event übergeben?

Ich habe als Grundgerüst diesen Code genommen: [Lösung] Problem mit EventHandler

Vielen Dank für Eure Hilfe im Voraus! Vielleicht steh ich auch einfach nur auf der Leitung 😦

D
67 Beiträge seit 2006
vor 15 Jahren

Habe ich es richtig verstanden, dass du den Rückgabewert per Event weitergeben willst? Ich sehe da zwei Lösungsmöglichkeiten (Für weitere bin ich offen). Ich weiß allerdings nicht, welche die Bessere ist. Vll kann dazu jmd was sagen.

Also 1: Den Rückgabewert in eine Propertie speicher, dass Event auslösen und die Klasse die das Event abonniert hat, liest die Properite aus:


public class HandScanner
{
  private object _rueckgabe;

  public object Rueckgabe
  {
    get { return _rueckgabe;}
  }
 
  private void UeberwacheHandScanner()
  {
    if(_rueckgabe != rueckgabeNeuerPing)
    {
      _rueckgabe = rueckgabeNeuerPing;
      OnChangeEvent();
    }
  }

  public delegate void EventDelegate(object source, EventArgs e);

  public event  EventDelegate ChangeEvent;

  private void OnChangeEvent()
  {
    if(ChangeEvent != null)
    {
      ChangeEvent(this, new EventArgs());
    }
  }
}

public class VerarbeiteRueckgabe
{
  public VerarbeiteRueckgabe()
  {
    _handScanner = new HandScanner;
    _handScanner.ChangeEvent += EventDelegate(_handScanner_ChangeEvent);
  }
  private HandScanner _handScanner;
  
  private void _handScanner_ChangeEvent(object value, EventArgs e)
  {
      object rueckgabe = _handScanner.Rueckgabe;
  }
}

oder 2. den Übergabewert mit ins Event verpacken:


public class HandScanner
{
  private void UeberwacheHandScanner()
  {
    if(rueckgabeAlterPing != rueckgabeNeuerPing)
    {
       OnChangeEvent(rueckgabeNeuerPing);
    } 
  }

  public delegate void EventDelegate(object value, EventArgs e);

  public event  EventDelegate ChangeEvent;

  private void OnChangeEvent(object rueckgabe)
  {
    if(ChangeEvent != null)
    {
      ChangeEvent(rueckgabe, new EventArgs ());
    }
  }
}

public class VerarbeiteRueckgabe
{
  public VerarbeiteRueckgabe()
  {
    _handScanner = new HandScanner;
    _handScanner.ChangeEvent += EventDelegate(_handScanner_ChangeEvent);
  }
  private HandScanner _handScanner;
  
  private void _handScanner_ChangeEvent(object value, EventArgs e)
  {
      object rueckgabe = value;
  }
}

Ich habe den Code nicht getestet. Nur kurz runtergeschrieben. Wie gesagt, so würde ich es lösen, weiß allerdings nicht, welche der Beiden Methoden besser ist.

„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay

3.511 Beiträge seit 2005
vor 15 Jahren

Golo Roden hat auf seiner "Guide to c#"-Seite einen Interessanten Artikel: Events

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo benji,

Du definierst in dem Beispielcode von Herbivore einen Delegaten mit dem Namen "MyHandler". Dieser Delegat definiert wie die aufzurufende Methode auszusehen hat (Methodenrumpf).

In Herbivore's Fall sind das 2 Strings. Du kannst hier aber definieren was Du möchtest. Wenn Du z.B. einen Bool-Wert übertragen willst (Ping war erfolgreich), dann definierst Du das folgendermaßen:


public delegate void MyHandler (bool p_PingSuccesfull);

Entsprechend muss dann natürlich die Event-Behandlungsmethode und auch die "OnXXX"-Methode angepasst werden.

Der Parameter wird dann über die "OnXXX"-Methode an folgender Stelle übergeben:


   protected virtual void OnMyEvent (bool p_PingErfolgreich)
   {
      MyHandler myEvent = MyEvent;
      if (myEvent != null) {
         myEvent (p_PingErfolgreich); // hier werden alle Behandlungs-Methode aufgerufen
      }
   }


Hoffe, dass Parameter für eigene Events nun klarer geworden sind?

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

Gelöschter Account
vor 15 Jahren

hallo davidG,

in variante 1 ist beschrieben, wie amn es generell nicht machen sollte. hierfür sind evantargs (wie der name schon sagt) gut.

in variante 2 machst du es fast richtig aber:

  1. erster parameter sollte immer der sender sein, damit man immer weiß wer das event schmeißt
  2. die informatione gehört immer in die eventargs

hallo benji,

im prinzip kannst du ein event erstellen, das den sender (also aktuelle instanz der auslösenden klasse) und die von dir erstellten eventargs mitgibt. eventuell musst du von eventargs erben und noch ein zusätzliches feld/propertie definieren.

wie man es richtig macht ist auf golos styleguide beschrieben:
http://www.guidetocsharp.de/CodingStyleEvents.aspx

D
67 Beiträge seit 2006
vor 15 Jahren

danke für die hinweise

„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay

B
benji Themenstarter:in
6 Beiträge seit 2008
vor 15 Jahren

Wow danke für die superschnellen Antworten!

Ich werde gleich mal alles ausprobieren...