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?
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?
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);
}
Ich denke, ich kann die EventArgs durch meine eigene Klasse ersetzen? –
Ja, obwohl Sie EventHandler verwenden würden
Es ist auch eine gemeinsame.NET-Praxis, die Ihre benutzerdefinierte EventArgs-Klasse erbt von EventArgs – Sekhat
Blick in 'delegates'.
hoffe, das hilft,
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!");
}
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
und vielen Dank für Ihre Hilfe !! –
WinForms, WebForms, ASP.NET MVC oder WPF? – Oded
etwas mehr Hintergrund? – Grzenio
Vielen Dank für alle Antworten !! Sie halfen mir alle zusammen;) Danke nochmal !! –