【发布时间】:2013-08-11 08:54:54
【问题描述】:
我想在陷阱发生时向任何订阅者发送警报消息。
我创建的代码使用委托方法myDelegate del 可以正常工作。
我的问题是:
我想知道使用
EventHandler代替委托是否更好? 在我的情况下,我不确定代表和EventHandler之间有什么区别。notify(trapinfo t),这就是我在这里获取陷阱信息的方法。但这似乎不是一个好主意。我阅读了一些介绍传递委托对象的在线教程;我想知道这是否适合我的情况?我该怎么做?有什么建议吗?
非常感谢:)
我的代码:
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();
}
}
2013 年 8 月 12 日更新
observer/observable 设计模式怎么样,在我的情况下看起来很棒 (EventHandler)。
在我的例子中,一台机器订阅了一个陷阱信使。 (将机器添加到调用列表)
一旦发生陷阱,我会向所有订阅的机器发送一条消息。 (拨打HandleEvent处理)
优点:
不再关心
GetInvocationList(),只需使用(+=)和(-=)来决定向谁发送陷阱。我的程序逻辑更容易理解。
我知道有几种方法可以做到这一点,但我希望我能分析一下它的优缺点。
感谢您的 cmets 和建议,这将非常有帮助!
我阅读了 Matthew Watson 建议的 MSDN EventArgs 文章。
这是我的活动版本:
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();
}
}
【问题讨论】:
标签: c# delegates event-handling observer-pattern