Tôi muốn thông báo một tin nhắn cảnh báo cho bất kỳ người đăng ký nào khi xảy ra bẫy.C# delegate v.s. eventHandler
Mã tôi thực hiện hoạt động tốt thông qua phương thức ủy nhiệm (myDelegate del).
câu hỏi của tôi là ..
tôi muốn biết là nó có giá trị sử dụng EventHandler khấm khá hơn đại biểu? không chắc chắn những gì khác nhau giữa đại biểu và sự kiện chính xác trong trường hợp của tôi?
thông báo (trapinfo t), đó là những gì tôi đã làm ở đây, để lấy thông tin về bẫy. Nhưng có vẻ như đó không phải là một ý tưởng hay. Đọc một số bài học hướng dẫn trực tuyến giới thiệu đối tượng đại diện đi qua, nó có phù hợp với trường hợp của tôi không? Và tôi nên làm gì? Bất kỳ đề xuất?
Thanks a lot :)
Mã của tôi:
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();
}
}
Cập nhật 2013-08-12
Làm thế nào về quan sát/quan sát mẫu thiết kế, mà vẻ bề ngoài tuyệt vời cho trường hợp của tôi. (EventHandler) Super-simple example of C# observer/observable with delegates
Trong trường hợp của tôi, máy đăng ký một tin nhắn bẫy. (Thêm máy vào danh sách yêu cầu) Sau khi xảy ra bẫy, hãy gửi tin nhắn đến tất cả các máy đã đăng ký. (Gọi handleEvent để xử lý nó)
Ưu điểm:
không quan tâm GetInvocationList() nữa, chỉ cần sử dụng (+ =) và (- =) để quyết định ai bẫy gửi đến.
Dễ hiểu logic của chương trình của tôi.
Tôi biết sẽ có một số cách để làm điều đó, nhưng tôi ước tôi có thể phân tích ưu và nhược điểm của nó. Và cảm ơn nhận xét và đề xuất của bạn, điều đó sẽ rất hữu ích!
tôi đọc EventArgs MSDN Điều mà Matthew Watson gợi ý system.eventargs
Dưới đây là bản tổ chức sự kiện của tôi:
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();
}
}
thể trùng lặp của [Hiểu sự kiện và xử lý sự kiện trong C#] (http://stackoverflow.com/questions/803242/understanding-events-and-event-handlers-in-c-sharp) –