2010-03-15 9 views
17

Ich möchte eigene Ereignisse erstellen und sie versenden. Ich habe das nie zuvor in C# gemacht, nur in Flex .. Ich denke, es muss eine Menge Unterschiede geben.So verschicken Sie Ereignisse in C#

Kann mir jemand ein gutes Beispiel geben?

+1

WinForms, WebForms, ASP.NET MVC oder WPF? – Oded

+1

etwas mehr Hintergrund? – Grzenio

+0

Vielen Dank für alle Antworten !! Sie halfen mir alle zusammen;) Danke nochmal !! –

Antwort

43

Es gibt ein Muster, das in allen Bibliotheksklassen verwendet wird. Es wird auch für eigene Klassen empfohlen, insbesondere für Framework/Bibliothekscode. Aber niemand wird Sie aufhalten, wenn Sie abweichen oder ein paar Schritte überspringen.

Hier ist ein Schema basierend auf dem einfachsten Event-Delegaten, System.Eventhandler.

// The delegate type. This one is already defined in the library, in the System namespace 
// the `void (object, EventArgs)` signature is also the recommended pattern 
public delegate void Eventhandler(object sender, Eventargs args); 

// your publishing class 
class Foo 
{ 
    public event EventHandler Changed; // the Event 

    protected virtual void OnChanged() // the Trigger method, called to raise the event 
    { 
     // make a copy to be more thread-safe 
     EventHandler handler = Changed; 

     if (handler != null) 
     { 
      // invoke the subscribed event-handler(s) 
      handler(this, EventArgs.Empty); 
     } 
    } 

    // an example of raising the event 
    void SomeMethod() 
    { 
     if (...)  // on some condition 
     OnChanged(); // raise the event 
    } 
} 

Und wie man es benutzt:

// your subscribing class 
class Bar 
{  
    public Bar() 
    { 
     Foo f = new Foo(); 
     f.Changed += Foo_Changed; // Subscribe, using the short notation 
    } 

    // the handler must conform to the signature 
    void Foo_Changed(object sender, EventArgs args) // the Handler (reacts) 
    { 
     // the things Bar has to do when Foo changes 
    } 
} 

Und wenn Sie Informationen haben entlang weitergeben müssen:

class MyEventArgs : EventArgs // guideline: derive from EventArgs 
{ 
    public string Info { get; set; } 
} 

class Foo 
{ 
    public event EventHandler<MyEventArgs> Changed; // the Event 
    ... 
    protected virtual void OnChanged(string info)  // the Trigger 
    { 
     EventHandler handler = Changed; // make a copy to be more thread-safe 
     if (handler != null) 
     { 
      var args = new MyEventArgs(){Info = info}; // this part will vary 
      handler(this, args); 
     } 
    } 
} 

class Bar 
{  
    void Foo_Changed(object sender, MyEventArgs args) // the Handler 
    { 
     string s = args.Info; 
     ... 
    } 
} 

aktualisieren

Beginnend mit 6 C#, um die Vorwahlnummer in der ‚Trigger‘ Methode worden ist kann viel einfacher, der Null-Test mit der Null-Konditionaloperator verkürzt wird ?., ohne eine Kopie zu machen, während Thread-Sicherheit zu halten:

protected virtual void OnChanged(string info) // the Trigger 
{ 
    var args = new MyEventArgs{Info = info}; // this part will vary 
    Changed?.Invoke(this, args); 
} 
+0

Ich denke, ich kann die EventArgs durch meine eigene Klasse ersetzen? –

+1

Ja, obwohl Sie EventHandler verwenden würden wo T ist der Typ Ihrer Veranstaltung args aka .. public event EventHandler MyEvent; – Sekhat

+1

Es ist auch eine gemeinsame.NET-Praxis, die Ihre benutzerdefinierte EventArgs-Klasse erbt von EventArgs – Sekhat

0

Blick in 'delegates'.

  • definieren einen Delegaten
  • Verwenden Sie den Delegattyp als Feld/Objekt (Hinzufügen des ‚Ereignis‘ keyword)
  • Du aussetzt jetzt Ereignisse, die Benutzer in mit Haken können " + = MyEventMethod; "

hoffe, das hilft,

3

Events in C# Verwendung Teilnehmer.

public static event EventHandler<EventArgs> myEvent; 

static void Main() 
{ 
    //add method to be called 
    myEvent += Handler; 

    //call all methods that have been added to the event 
    myEvent(this, EventArgs.Empty); 
} 

static void Handler(object sender, EventArgs args) 
{ 
    Console.WriteLine("Event Handled!"); 
} 
3

Verwenden Sie das typische .NET-Ereignismuster und nehmen Sie an, dass Sie in Ihrem Ereignis keine speziellen Argumente benötigen. Ihr typisches Ereignis- und Versandmuster sieht so aus.

public class MyClassWithEvents 
    { 
     public event EventHandler MyEvent; 

     protected void OnMyEvent(object sender, EventArgs eventArgs) 
     { 
      if (MyEvent != null) 
      { 
       MyEvent(sender, eventArgs); 
      } 
     } 

     public void TriggerMyEvent() 
     { 
      OnMyEvent(sender, eventArgs); 
     } 
    } 

etwas in das Ereignis binden kann so einfach sein wie:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     MyClassWithEvents obj = new MyClassWithEvents(); 

     obj.MyEvent += obj_myEvent; 
    } 

    private static void obj_myEvent(object sender, EventArgs e) 
    { 
     //Code called when my event is dispatched. 
    } 
} 

auf die Links Werfen Sie einen Blick auf this MSDN page

+0

und vielen Dank für Ihre Hilfe !! –