Desidero comunicare un messaggio di avviso a tutti i sottoscrittori in caso di trap.C# delegato v.s. eventHandler
Il codice che ho eseguito funziona correttamente con un metodo delegato (myDelegate del).
le mie domande sono ..
che voglio sapere è la pena usare EventHandler meglio delegato? non è sicuro che cosa c'è di diverso tra delegato ed evento esattamente nel mio caso?
notifica (trapinfo t), questo è quello che ho fatto qui, per ottenere informazioni sulla trappola. Ma sembra non essere una buona idea. Leggi alcune lezioni di tutorial online che introducono l'oggetto dei delegati di passaggio, è appropriato per il mio caso? E come dovrei fare? Eventuali suggerimenti?
Grazie mille :)
Il mio codice:
public class trapinfo
{
public string info;
public string ip;
public string cause;
}
public class trap
{
public delegate void myDelegate(trapinfo t);
public myDelegate del;
trapinfo info = new trapinfo();
public void run()
{
//While(true)
// If a trap occurred, notify the subscriber
for (; ;)
{
Thread.Sleep(500);
foreach (myDelegate d in del.GetInvocationList())
{
info.cause = "Shut Down";
info.ip = "192.168.0.1";
info.info = "Test";
d.Invoke(info);
}
}
}
}
public class machine
{
private int _occuredtime=0;
public trapinfo info = new trapinfo();
public void notify(trapinfo t)
{
++_occuredtime;
info.cause = t.cause;
info.info = t.info;
info.ip = t.ip;
getInfo();
}
public void subscribe(trap t)
{
t.del += new trap.myDelegate(notify);
}
public void getInfo()
{
Console.WriteLine("<Alert>: cauese/{0}, info/ {1}, ip/{2}, time/{3}",
info.cause, info.info, info.ip,_occuredtime);
}
}
class Program
{
static void Main(string[] args)
{
trap t = new trap();
machine machineA = new machine();
machineA.subscribe(t);
t.run();
}
}
Aggiornamento 2013-08-12
ne dite di osservatore/design pattern osservabili, che sembra ottimo per il mio caso. (EventHandler) Super-simple example of C# observer/observable with delegates
Nel mio caso, una macchina sottoscrive un trap Messenger. (Aggiungi macchina a un elenco di chiamate) Una volta verificata una trap, invia un messaggio a tutte le macchine che sono iscritte. (Chiamata handleEvent gestirlo)
Vantaggio:
non si preoccupano GetInvocationList() più, basta usare (+ =) e (- =) per decidere chi trappola di invio a.
Facile capire la logica del mio programma.
So che ci sarebbero diversi modi per farlo, ma vorrei poterne analizzare i pro ei contro. E grazie per i vostri commenti e suggerimenti, sarebbe molto utile!
ho letto MSDN EventArgs articolo che Matthew Watson suggerisce system.eventargs
Ecco il mio evento Versione:
public class TrapInfoEventArgs : EventArgs
{
public int info { get; set; }
public string ip { get; set; }
public string cause { get; set; }
}
public class trap
{
public event EventHandler<TrapInfoEventArgs> TrapOccurred;
protected virtual void OnTrapOccurred(TrapInfoEventArgs e)
{
EventHandler<TrapInfoEventArgs> handler = TrapOccurred;
if (handler != null)
{
handler(this, e);
}
}
public void run()
{
//While(true)
// If a trap occurred, notify the subscriber
for (; ;)
{
Thread.Sleep(500);
TrapInfoEventArgs args = new TrapInfoEventArgs();
args.cause = "Shut Down";
OnTrapOccurred(args);
}
}
}
public class machine
{
public void c_TrapOccurred(object sender, TrapInfoEventArgs e)
{
Console.WriteLine("<Alert>: cauese/{0}, info/ {1}, ip/{2}, time/{3}",
e.cause, e.info, e.ip, DateTime.Now.ToString());
}
}
class Program
{
static void Main(string[] args)
{
trap t = new trap();
machine machineA = new machine();
t.TrapOccurred += machineA.c_TrapOccurred; //notify machine A
t.run();
}
}
possibile duplicato del [eventi comprensione e gestori di eventi in C#] (http://stackoverflow.com/questions/803242/understanding-events-and-event-handlers-in-c-sharp) –