Trang chủ
Bài viết mới
Diễn đàn
Bài mới trên hồ sơ
Hoạt động mới nhất
VIDEO
Mùa Tết
Văn Học Trẻ
Văn Học News
Media
New media
New comments
Search media
Đại Học
Đại cương
Chuyên ngành
Triết học
Kinh tế
KHXH & NV
Công nghệ thông tin
Khoa học kĩ thuật
Luận văn, tiểu luận
Phổ Thông
Lớp 12
Ngữ văn 12
Lớp 11
Ngữ văn 11
Lớp 10
Ngữ văn 10
LỚP 9
Ngữ văn 9
Lớp 8
Ngữ văn 8
Lớp 7
Ngữ văn 7
Lớp 6
Ngữ văn 6
Tiểu học
Thành viên
Thành viên trực tuyến
Bài mới trên hồ sơ
Tìm trong hồ sơ cá nhân
Credits
Transactions
Xu: 0
Đăng nhập
Đăng ký
Có gì mới?
Tìm kiếm
Tìm kiếm
Chỉ tìm trong tiêu đề
Bởi:
Hoạt động mới nhất
Đăng ký
Menu
Đăng nhập
Đăng ký
Install the app
Cài đặt
Chào mừng Bạn tham gia Diễn Đàn VNKienThuc.com -
Định hướng Forum
Kiến Thức
- HÃY TẠO CHỦ ĐỀ KIẾN THỨC HỮU ÍCH VÀ CÙNG NHAU THẢO LUẬN Kết nối:
VNK X
-
VNK groups
| Nhà Tài Trợ:
BhnongFood X
-
Bhnong groups
-
Đặt mua Bánh Bhnong
CÔNG NGHỆ
Công Nghệ Thông Tin
Code
Tìm hiểu về sự kiện trong C#
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Trả lời chủ đề
Nội dung
<blockquote data-quote="uocmo_kchodoi" data-source="post: 177602" data-attributes="member: 165510"><p><a href="https://vnkienthuc.com/forums/hoi-dap-tin-hoc.378/" target="_blank"><span style="font-size: 18px">Sự kiện (Event)</span></a><span style="font-size: 18px"> 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.</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><span style="color: #0000ff"><strong>2. Sử dụng Delegate với Event trong C#</strong></span></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><a href="https://vnkienthuc.com/forums/thu-thuat-tin-hoc.376/" target="_blank">Các Event được khai báo</a> 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.</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px">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.</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><a href="https://vnkienthuc.com/forums/code.377/" target="_blank">Một Subscriber trong C# </a>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.</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><span style="color: #0000ff"><strong>3. Khai báo Event trong C#</strong></span></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px">Để 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ụ:</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px">public delegate void BoilerLogHandler(string status);</span></p><p><span style="font-size: 18px">Tiếp theo, chính Event đó được khai báo, bởi sử dụng từ khóa event trong C#:</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px">//định nghĩa event dựa vào delegate ở trên</span></p><p><span style="font-size: 18px">public event BoilerLogHandler BoilerEventLog;</span></p><p><span style="font-size: 18px">Code trên định nghĩa một delegate với tên là <em>BoilerLogHandler</em> và một Event với tên là <a href="https://vnkienthuc.com/threads/tim-hieu-ve-collection-trong-c.77358/" target="_blank"><em>BoilerEventLog</em></a>, mà triệu hồi delegate đó khi nó được tạo ra.</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><strong>Ví dụ 1</strong></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px">Tạo hai lớp có tên lần lượt là EventTest, TestCsharp như sau:</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px">Lớp EventTest:</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em>using System;</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em>namespace VietJackCsharp</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em>{</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> class EventTest</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> {</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> private int value;</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> public delegate void NumManipulationHandler();</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> public event NumManipulationHandler ChangeNum;</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> protected virtual void OnNumChanged()</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> {</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> if (ChangeNum != null)</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> {</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> ChangeNum();</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> }</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> else</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> {</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> Console.WriteLine("Kich hoat su kien!");</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> }</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> }</em></span></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> public EventTest(int n)</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> {</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> SetValue<img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f44e.png" class="smilie smilie--emoji" loading="lazy" width="72" height="72" alt="(n)" title="Thumbs down (n)" data-smilie="23"data-shortname="(n)" />;</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> }</em></span></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> public void SetValue(int n)</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> {</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> if (value != n)</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> {</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> value = n;</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> OnNumChanged();</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> }</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> }</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> }</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em>}</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em>Lớp TestCsharp:</em></span></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em>using System;</em></span></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em>namespace VietJackCsharp</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em>{</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> class TestCsharp</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> {</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> static void Main(string[] args)</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> {</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> Console.WriteLine("Vi du minh hoa Su kien (Event) trong C#");</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> Console.WriteLine("----------------------------------");</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> //tao doi tuong EventTest</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> EventTest e = new EventTest(5);</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> e.SetValue(7);</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> e.SetValue(11);</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> Console.ReadKey();</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> }</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em> }</em></span></span></p><p><span style="font-size: 18px"><span style="color: #5900b3"><em>}</em></span></span></p><p><span style="font-size: 18px">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.</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px">Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:</span></p><p><span style="font-size: 18px"></span></p><p style="text-align: center"><span style="font-size: 18px"><img src="https://vietjack.com/csharp/images/su-kien.PNG" alt="" class="fr-fic fr-dii fr-draggable " data-size="" style="" /></span></p><p><span style="font-size: 18px"><strong>Ví dụ 2</strong></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px">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.</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px">Tạo 4 lớp có tên lần lượt là Boiler, DelegateBoilerEvent, BoilerInfoLogger, TestCsharpnhư sau:</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px">Lớp Boiler:</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">using System;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">{</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> class Boiler</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> private int temp;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> private int pressure;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> public Boiler(int t, int p)</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> temp = t;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> pressure = p;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> public int getTemp()</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> return temp;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> public int getPressure()</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> return pressure;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">}</span></em></span></p><p><span style="font-size: 18px">Lớp DelegateBoilerEvent: đóng vai trò như là event publisher</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">using System;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">{</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> class DelegateBoilerEvent</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> public delegate void BoilerLogHandler(string status);</span></em></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> //dinh nghia su kien dua vao delegate tren</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> public event BoilerLogHandler BoilerEventLog;</span></em></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> public void LogProcess()</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> string remarks = "OK!";</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> Boiler b = new Boiler(100, 12);</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> int t = b.getTemp();</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> int p = b.getPressure();</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> if(t > 150 || t < 80 || p < 12 || p > 15)</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> remarks = "Can duy tri";</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> OnBoilerEventLog("Thong tin log:\n");</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> OnBoilerEventLog("Nhiet do: " + t + "\nAp suat: " + p);</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> OnBoilerEventLog("\nThong bao: " + remarks);</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> protected void OnBoilerEventLog(string message)</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> if (BoilerEventLog != null)</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> BoilerEventLog(message);</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">}</span></em></span></p><p><span style="font-size: 18px">Lớp BoilerInfoLogger:</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">using System;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">using System.IO;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">{</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> class BoilerInfoLogger</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> FileStream fs;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> StreamWriter sw;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> public BoilerInfoLogger(string filename)</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> fs = new FileStream(filename, FileMode.Append, FileAccess.Write);</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> sw = new StreamWriter(fs);</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> public void Logger(string info)</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> sw.WriteLine(info);</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> public void Close()</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> sw.Close();</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> fs.Close();</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">}</span></em></span></p><p><span style="font-size: 18px">Lớp TestCsharp: event subscriber</span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">using System;</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">namespace VietJackCsharp</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">{</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> class TestCsharp</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> static void Logger(string info)</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> Console.WriteLine(info);</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> static void Main(string[] args)</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> {</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> Console.WriteLine("Vi du minh hoa su kien trong C#");</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> Console.WriteLine("---------------------------------");</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> </span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> BoilerInfoLogger filelog = new BoilerInfoLogger("e:\\boiler.txt");</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> DelegateBoilerEvent boilerEvent = new DelegateBoilerEvent();</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> boilerEvent.BoilerEventLog += new</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> DelegateBoilerEvent.BoilerLogHandler(Logger);</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> boilerEvent.BoilerEventLog += new</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> DelegateBoilerEvent.BoilerLogHandler(filelog.Logger);</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> boilerEvent.LogProcess();</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> Console.ReadLine();</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> Console.ReadKey();</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> filelog.Close();</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3"> }</span></em></span></p><p><span style="font-size: 18px"><em><span style="color: #5900b3">}</span></em></span></p><p><span style="font-size: 18px">Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:</span></p><p><span style="font-size: 18px"></span></p><p style="text-align: center"><span style="font-size: 18px"><img src="https://vietjack.com/csharp/images/su-kien-1.PNG" alt="" class="fr-fic fr-dii fr-draggable " data-size="" style="" /></span></p><p></p><p style="text-align: right"><span style="font-size: 18px">Nguồn: vietjack.com</span></p></blockquote><p></p>
[QUOTE="uocmo_kchodoi, post: 177602, member: 165510"] [URL='https://vnkienthuc.com/forums/hoi-dap-tin-hoc.378/'][SIZE=5]Sự kiện (Event)[/SIZE][/URL][SIZE=5] 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. [COLOR=#0000ff][B]2. Sử dụng Delegate với Event trong C#[/B][/COLOR] [URL='https://vnkienthuc.com/forums/thu-thuat-tin-hoc.376/']Các Event được khai báo[/URL] 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. [URL='https://vnkienthuc.com/forums/code.377/']Một Subscriber trong C# [/URL]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. [COLOR=#0000ff][B]3. Khai báo Event trong C#[/B][/COLOR] Để 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à [I]BoilerLogHandler[/I] và một Event với tên là [URL='https://vnkienthuc.com/threads/tim-hieu-ve-collection-trong-c.77358/'][I]BoilerEventLog[/I][/URL], mà triệu hồi delegate đó khi nó được tạo ra. [B]Ví dụ 1[/B] Tạo hai lớp có tên lần lượt là EventTest, TestCsharp như sau: Lớp EventTest: [COLOR=#5900b3][I]using System;[/I] [I]namespace VietJackCsharp[/I] [I]{[/I] [I] class EventTest[/I] [I] {[/I] [I] private int value;[/I] [I] public delegate void NumManipulationHandler();[/I] [I] public event NumManipulationHandler ChangeNum;[/I] [I] protected virtual void OnNumChanged()[/I] [I] {[/I] [I] if (ChangeNum != null)[/I] [I] {[/I] [I] ChangeNum();[/I] [I] }[/I] [I] else[/I] [I] {[/I] [I] Console.WriteLine("Kich hoat su kien!");[/I] [I] }[/I] [I] }[/I][/COLOR] [COLOR=#5900b3][I] public EventTest(int n)[/I] [I] {[/I] [I] SetValue(n);[/I] [I] }[/I][/COLOR] [COLOR=#5900b3][I] public void SetValue(int n)[/I] [I] {[/I] [I] if (value != n)[/I] [I] {[/I] [I] value = n;[/I] [I] OnNumChanged();[/I] [I] }[/I] [I] }[/I] [I] }[/I] [I]}[/I] [I]Lớp TestCsharp:[/I][/COLOR] [COLOR=#5900b3][I]using System;[/I][/COLOR] [COLOR=#5900b3][I]namespace VietJackCsharp[/I] [I]{[/I] [I] class TestCsharp[/I] [I] {[/I] [I] static void Main(string[] args)[/I] [I] {[/I] [I] Console.WriteLine("Vi du minh hoa Su kien (Event) trong C#");[/I] [I] Console.WriteLine("----------------------------------");[/I] [I] //tao doi tuong EventTest[/I] [I] EventTest e = new EventTest(5);[/I] [I] e.SetValue(7);[/I] [I] e.SetValue(11);[/I] [I] Console.ReadKey();[/I] [I] }[/I] [I] }[/I] [I]}[/I][/COLOR] 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: [/SIZE] [CENTER][SIZE=5][IMG]https://vietjack.com/csharp/images/su-kien.PNG[/IMG][/SIZE][/CENTER] [SIZE=5][B]Ví dụ 2[/B] 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: [I][COLOR=#5900b3]using System;[/COLOR][/I] [I][COLOR=#5900b3]namespace VietJackCsharp[/COLOR][/I] [I][COLOR=#5900b3]{[/COLOR][/I] [I][COLOR=#5900b3] class Boiler[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] private int temp;[/COLOR][/I] [I][COLOR=#5900b3] private int pressure;[/COLOR][/I] [I][COLOR=#5900b3] public Boiler(int t, int p)[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] temp = t;[/COLOR][/I] [I][COLOR=#5900b3] pressure = p;[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] public int getTemp()[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] return temp;[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] public int getPressure()[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] return pressure;[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3]}[/COLOR][/I] Lớp DelegateBoilerEvent: đóng vai trò như là event publisher [I][COLOR=#5900b3]using System;[/COLOR][/I] [I][COLOR=#5900b3]namespace VietJackCsharp[/COLOR][/I] [I][COLOR=#5900b3]{[/COLOR][/I] [I][COLOR=#5900b3] class DelegateBoilerEvent[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] public delegate void BoilerLogHandler(string status);[/COLOR][/I] [I][COLOR=#5900b3] //dinh nghia su kien dua vao delegate tren[/COLOR][/I] [I][COLOR=#5900b3] public event BoilerLogHandler BoilerEventLog;[/COLOR][/I] [I][COLOR=#5900b3] public void LogProcess()[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] string remarks = "OK!";[/COLOR][/I] [I][COLOR=#5900b3] Boiler b = new Boiler(100, 12);[/COLOR][/I] [I][COLOR=#5900b3] int t = b.getTemp();[/COLOR][/I] [I][COLOR=#5900b3] int p = b.getPressure();[/COLOR][/I] [I][COLOR=#5900b3] if(t > 150 || t < 80 || p < 12 || p > 15)[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] remarks = "Can duy tri";[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] OnBoilerEventLog("Thong tin log:\n");[/COLOR][/I] [I][COLOR=#5900b3] OnBoilerEventLog("Nhiet do: " + t + "\nAp suat: " + p);[/COLOR][/I] [I][COLOR=#5900b3] OnBoilerEventLog("\nThong bao: " + remarks);[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] protected void OnBoilerEventLog(string message)[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] if (BoilerEventLog != null)[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] BoilerEventLog(message);[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3]}[/COLOR][/I] Lớp BoilerInfoLogger: [I][COLOR=#5900b3]using System;[/COLOR][/I] [I][COLOR=#5900b3]using System.IO;[/COLOR][/I] [I][COLOR=#5900b3]namespace VietJackCsharp[/COLOR][/I] [I][COLOR=#5900b3]{[/COLOR][/I] [I][COLOR=#5900b3] class BoilerInfoLogger[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] FileStream fs;[/COLOR][/I] [I][COLOR=#5900b3] StreamWriter sw;[/COLOR][/I] [I][COLOR=#5900b3] public BoilerInfoLogger(string filename)[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] fs = new FileStream(filename, FileMode.Append, FileAccess.Write);[/COLOR][/I] [I][COLOR=#5900b3] sw = new StreamWriter(fs);[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] public void Logger(string info)[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] sw.WriteLine(info);[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] public void Close()[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] sw.Close();[/COLOR][/I] [I][COLOR=#5900b3] fs.Close();[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3]}[/COLOR][/I] Lớp TestCsharp: event subscriber [I][COLOR=#5900b3]using System;[/COLOR][/I] [I][COLOR=#5900b3]namespace VietJackCsharp[/COLOR][/I] [I][COLOR=#5900b3]{[/COLOR][/I] [I][COLOR=#5900b3] class TestCsharp[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] static void Logger(string info)[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] Console.WriteLine(info);[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] static void Main(string[] args)[/COLOR][/I] [I][COLOR=#5900b3] {[/COLOR][/I] [I][COLOR=#5900b3] Console.WriteLine("Vi du minh hoa su kien trong C#");[/COLOR][/I] [I][COLOR=#5900b3] Console.WriteLine("---------------------------------");[/COLOR][/I] [I][COLOR=#5900b3] [/COLOR][/I] [I][COLOR=#5900b3] BoilerInfoLogger filelog = new BoilerInfoLogger("e:\\boiler.txt");[/COLOR][/I] [I][COLOR=#5900b3] DelegateBoilerEvent boilerEvent = new DelegateBoilerEvent();[/COLOR][/I] [I][COLOR=#5900b3] boilerEvent.BoilerEventLog += new[/COLOR][/I] [I][COLOR=#5900b3] DelegateBoilerEvent.BoilerLogHandler(Logger);[/COLOR][/I] [I][COLOR=#5900b3] boilerEvent.BoilerEventLog += new[/COLOR][/I] [I][COLOR=#5900b3] DelegateBoilerEvent.BoilerLogHandler(filelog.Logger);[/COLOR][/I] [I][COLOR=#5900b3] boilerEvent.LogProcess();[/COLOR][/I] [I][COLOR=#5900b3] Console.ReadLine();[/COLOR][/I] [I][COLOR=#5900b3] Console.ReadKey();[/COLOR][/I] [I][COLOR=#5900b3] filelog.Close();[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3] }[/COLOR][/I] [I][COLOR=#5900b3]}[/COLOR][/I] Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau: [/SIZE] [CENTER][SIZE=5][IMG]https://vietjack.com/csharp/images/su-kien-1.PNG[/IMG][/SIZE][/CENTER] [SIZE=5][/SIZE] [RIGHT][SIZE=5]Nguồn: vietjack.com[/SIZE][/RIGHT] [/QUOTE]
Tên
Mã xác nhận
Gửi trả lời
CÔNG NGHỆ
Công Nghệ Thông Tin
Code
Tìm hiểu về sự kiện trong C#
Top