Đề tài Tìm hiểu về sự kiện trong C# trong chuyên mục Code tại Butnghien.com.

#1
Sự kiện (Event) là các hành động của người dùng, ví dụ như nhấn phím, click, di chuyển chuột, … Các Application cần phản hồi các sự kiện này khi chúng xuất hiện. Ví dụ, các ngắt (interrupt). Các sự kiện (Event) được sử dụng để giao tiếp bên trong tiến trình.

2. Sử dụng Delegate với Event trong C#

Các Event được khai báo và được tạo trong một lớp và được liên kết với Event Handler bởi sử dụng các Delegate bên trong cùng lớp đó hoặc một số lớp khác. Lớp mà chứa Event được sử dụng để công bố event đó. Điều này được gọi là lớp Publisher. Một số lớp khác mà chấp nhận Event này được gọi là lớp Subscriber. Các Event trong C# sử dụng mô hình Publisher-Subscriber.

Một Publisher trong C# là một đối tượng mà chứa định nghĩa của event và delegate đó. Mối liên hệ event-delegate cũng được định nghĩa trong đối tượng này. Một đối tượng lớp Publisher triệu hồi Event và nó được thông báo tới các đối tượng khác.

Một Subscriber trong C# là một đối tượng mà chấp nhận event và cung cấp một Event Handler. Delegate trong lớp Publisher triệu hồi phương thức (Event Handler) của lớp Subscriber.

3. Khai báo Event trong C#

Để khai báo một Event bên trong một lớp, đầu tiên một kiểu delegate cho Event đó phải được khai báo. Ví dụ:

public delegate void BoilerLogHandler(string status);
Tiếp theo, chính Event đó được khai báo, bởi sử dụng từ khóa event trong C#:

//định nghĩa event dựa vào delegate ở trên
public event BoilerLogHandler BoilerEventLog;
Code trên định nghĩa một delegate với tên là BoilerLogHandler và một Event với tên là BoilerEventLog, mà triệu hồi delegate đó khi nó được tạo ra.

Ví dụ 1

Tạo hai lớp có tên lần lượt là EventTest, TestCsharp như sau:

Lớp EventTest:

using System;
namespace VietJackCsharp
{
class EventTest
{
private int value;
public delegate void NumManipulationHandler();
public event NumManipulationHandler ChangeNum;
protected virtual void OnNumChanged()
{
if (ChangeNum != null)
{
ChangeNum();
}
else
{
Console.WriteLine("Kich hoat su kien!");
}
}


public EventTest(int n)
{
SetValue(n);
}


public void SetValue(int n)
{
if (value != n)
{
value = n;
OnNumChanged();
}
}
}
}
Lớp TestCsharp:


using System;

namespace VietJackCsharp
{
class TestCsharp
{
static void Main(string[] args)
{
Console.WriteLine("Vi du minh hoa Su kien (Event) trong C#");
Console.WriteLine("----------------------------------");
//tao doi tuong EventTest
EventTest e = new EventTest(5);
e.SetValue(7);
e.SetValue(11);
Console.ReadKey();
}
}
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Ví dụ 2

Ví dụ này cung cấp một ứng dụng đơn giản để xử lý sự cố cho một hệ thống nồi hơn đun nước nóng. Khi kỹ sư bảo dưỡng kiểm tra nồi hơi, nhiệt độ và áp suất nồi hơi được tự động ghi lại vào trong một log file cùng với các ghi chú của kỹ sư bảo dưỡng này.

Tạo 4 lớp có tên lần lượt là Boiler, DelegateBoilerEvent, BoilerInfoLogger, TestCsharpnhư sau:

Lớp Boiler:

using System;
namespace VietJackCsharp
{
class Boiler
{
private int temp;
private int pressure;
public Boiler(int t, int p)
{
temp = t;
pressure = p;
}

public int getTemp()
{
return temp;
}

public int getPressure()
{
return pressure;
}
}
}
Lớp DelegateBoilerEvent: đóng vai trò như là event publisher

using System;
namespace VietJackCsharp
{
class DelegateBoilerEvent
{
public delegate void BoilerLogHandler(string status);

//dinh nghia su kien dua vao delegate tren
public event BoilerLogHandler BoilerEventLog;

public void LogProcess()
{
string remarks = "OK!";
Boiler b = new Boiler(100, 12);
int t = b.getTemp();
int p = b.getPressure();
if(t > 150 || t < 80 || p < 12 || p > 15)
{
remarks = "Can duy tri";
}
OnBoilerEventLog("Thong tin log:\n");
OnBoilerEventLog("Nhiet do: " + t + "\nAp suat: " + p);
OnBoilerEventLog("\nThong bao: " + remarks);
}

protected void OnBoilerEventLog(string message)
{
if (BoilerEventLog != null)
{
BoilerEventLog(message);
}
}
}
}
Lớp BoilerInfoLogger:

using System;
using System.IO;
namespace VietJackCsharp
{
class BoilerInfoLogger
{
FileStream fs;
StreamWriter sw;
public BoilerInfoLogger(string filename)
{
fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
sw = new StreamWriter(fs);
}

public void Logger(string info)
{
sw.WriteLine(info);
}

public void Close()
{
sw.Close();
fs.Close();
}
}
}
Lớp TestCsharp: event subscriber

using System;
namespace VietJackCsharp
{
class TestCsharp
{
static void Logger(string info)
{
Console.WriteLine(info);
}

static void Main(string[] args)
{
Console.WriteLine("Vi du minh hoa su kien trong C#");
Console.WriteLine("---------------------------------");

BoilerInfoLogger filelog = new BoilerInfoLogger("e:\\boiler.txt");
DelegateBoilerEvent boilerEvent = new DelegateBoilerEvent();
boilerEvent.BoilerEventLog += new
DelegateBoilerEvent.BoilerLogHandler(Logger);
boilerEvent.BoilerEventLog += new
DelegateBoilerEvent.BoilerLogHandler(filelog.Logger);
boilerEvent.LogProcess();
Console.ReadLine();
Console.ReadKey();
filelog.Close();
}
}
}
Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:


Nguồn: vietjack.com
 
Sửa lần cuối bởi điều hành viên:

Hoàng Xuân Bách

Moderator
Thành viên BQT
#2
Mô hình chuẩn sự kiện trong .Net

Nhiều khi chúng ta cần phải tạo ra nhiều sự kiện, mỗi sự kiện có cách viết khác nhau, không đồng bộ. Để khắc phục nhược điểm đó thì .Net Framework có đưa là một mô hình chuẩn để viết sự kiện giúp cho việc viết sự kiện dễ dàng. Mô hình này như sau:

Khai báo delegate có quy tắc rằng buộc:

  • Delegate có kiểu trả về là kiểu void.
  • Delegate có hai tham số, tham số thứ nhất có kiểu là object, tham số thứ hai có kiểu EventArgs. object chính là đối tượng phát sinh sự kiện, EventArgs chính là class giữ thông tin mà đối tượng gửi kèm trong quá trình phát sinh sự kiện.
 
Shoutbox
  1. Khoai Khoai:
    Hahaha... ăn hơi lâu đấy
  2. L LinhPham Kotaro:
    bụng vẫn in hình con gà :))
  3. N nhannhan132:
    ôi, chưa hòa nhập được với cuộc sống sau Tết. hic
  4. ButNghien ButNghien:
    Chào tuần mới kkk
  5. ButNghien ButNghien:
    Tên tâm. Đã khai xuân roài kkk
  6. Hide Nguyễn Hide Nguyễn:
    Chơi nốt hôm nay thôi chế ơi.. Mai lại cày cuốc rồi. Mong chế không bị.... tắc đường nha kkk
  7. ButNghien ButNghien:
    Mong 6, Het Tet Roi @@
  8. ButNghien ButNghien:
    Chúc mừng năm mới! Mã đáo thành công :)
  9. ButNghien ButNghien:
    9 năm, thời gian trôi nhanh thật.
  10. Khoai Khoai:
    Nhớ Tết 9 năm về trước Tết ngồi chatbox với cả diễn đàn thật là vui
  11. Khoai Khoai:
    Chúc mừng năm mới phát tài phát lộc
  12. D diendan Bút Nghiên:
    Chúc mừng năm mới! Mã đáo thành công diễn đàn Bút Nghiên
  13. ButNghien ButNghien:
    Chúc diễn đàn Bút Nghiên phát triển hơn nữa, lọt vào Top 500 web lớn tại Việt Nam
  14. ButNghien ButNghien:
    Chúc mừng năm mới Kỷ Hợi 2019. An Khang Thịnh Vượng! Phát Tài Phát Lộc. :) :vn:<3<3:thich:

Bài viết hồ sơ mới nhất

Lạnh lạnh lạnh quạ
Trang vàng http://trangvangtructuyen.vn/ cổng thông tin tra cứu doanh nghiệp
Tận hưởng nốt những giờ những phút cuối cùng của kỳ nghỉ :)
Het Tet that roai..
Hide Nguyễn wrote on yenbutterfly's profile.
Chúc mừng năm mới!

Thống kê diễn đàn

Chủ đề
62,520
Bài viết
165,844
Thành viên
312,387
Thành viên mới nhất
TruongNgan
Top