Sự kiện (Event) trong C#

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.

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.

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.

using System;

namespace SampleApp {
   public delegate string MyDel(string str);
	
   class EventProgram {
      event MyDel MyEvent;
		
      public EventProgram() {
         this.MyEvent += new MyDel(this.WelcomeUser);
      }
      public string WelcomeUser(string username) {
         return "Quantrimang.com xin chào " + username;
      }
      static void Main(string[] args) {
         EventProgram obj1 = new EventProgram();
         string result = obj1.MyEvent("bạn");
         Console.WriteLine(result);
      }
   }
}

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

Quantrimang.com xin chào bn

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.

Chương trình sẽ như sau:

using System;
using System.IO;

namespace QTMCsharp {
    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;
        }
    }

    class DelegateBoilerEvent {
        public delegate void BoilerLogHandler(string status);

        //định nghĩa sự kiện dựa vào delegate trên
        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 = "Cần duy trì";
         }
         OnBoilerEventLog("Thông tin bản ghi:\n");
         OnBoilerEventLog("Nhiệt độ: " + t + "\nÁp suất: " + p);
         OnBoilerEventLog("\nThông báo: " + remarks);
      }

        protected void OnBoilerEventLog(string message) {
            if (BoilerEventLog != null) {
                BoilerEventLog(message);
            }
        }
    }

    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();
        }
    }

    class TestCsharp {
        static void Logger(string info) {
            Console.WriteLine(info);
        }

        static void Main(string[] args) {
            Console.WriteLine("Ví dụ minh họa sự kiện 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();
        }
    }
}

Và khi chạy chương trình này bạn sẽ nhận được kết quả:

Ví d minh ha s kin trong C#
-------------------------------
Thông tin bn ghi:

Nhit độ: 100
Áp sut: 12

Thông báo: OK!