一、背景由於對於C#委托和事件理解的不夠透徹,並且平時工作中對於自己手寫委托和事件很少,漸漸的只會增刪改查了。特定整理了委托和事件的基本知識。二、案例案例引用了 張逸 博客 中的案例,並做了處理。 創建一個控制台項目,監測根目錄下是否有text.txt文件。 創建一個簡單的類,名為FileWatch ...
一、背景
由於對於C#委托和事件理解的不夠透徹,並且平時工作中對於自己手寫委托和事件很少,漸漸的只會增刪改查了。特定整理了委托和事件的基本知識。
二、案例
案例引用了 張逸 博客 中的案例,並做了處理。
創建一個控制台項目,監測根目錄下是否有text.txt文件。
創建一個簡單的類,名為FileWatch,包含事件FileWatchevent。該類將檢查在執行應用程式的目錄(當前
目錄,通常是項目名/bin/debug)下,是否存在文件text.txt。如果文件被刪除或創建,都將觸發事件。
同時提供一個方法MonitorFile以不斷地查詢該文件。
代碼中有註釋,看著方便
1 //定義委托 2 public delegate void FileWatchEventHandler(object sender, EventArgs e); 3 /// <summary> 4 /// 定義FileWatch 類 5 /// </summary> 6 public class FileWatch 7 { 8 //定義事件 9 public event FileWatchEventHandler FileWatchevent; 10 11 /// <summary> 12 /// 用於檢測test.txt 文件狀態 13 /// </summary> 14 public void MonitorFile() 15 { 16 bool isExist = false; 17 while (true) 18 { 19 isExist = File.Exists("test.txt"); 20 MyEventAgrs arg = new MyEventAgrs(); 21 arg.State = isExist ? "存在" : "不存在"; 22 23 if (FileWatchevent != null) 24 { 25 FileWatchevent(this, arg); 26 } 27 28 Thread.Sleep(200); 29 } 30 } 31 32 } 33 /// <summary> 34 /// MyEventAgrs ,用戶返迴文件狀態 35 /// </summary> 36 public class MyEventAgrs : EventArgs 37 { 38 private string _state; 39 40 public string State 41 { 42 get { return this._state; } 43 set { _state = value; } 44 } 45 }
下麵是調用方法:
1 class Program 2 { 3 static void Main(string[] args) 4 { //實例化 5 FileWatch fw = new FileWatch(); 6 7 //註冊事件 8 fw.FileWatchevent += new FileWatchEventHandler(OnFileChange); 9 10 //另開一個線程,用於檢測文件 11 Thread t = new Thread(fw.MonitorFile); 12 t.Start(); 13 14 Thread.Sleep(1000); 15 var filePath = AppDomain.CurrentDomain.BaseDirectory; 16 filePath = filePath + "test.txt"; 17 var fileStream = File.Create(filePath); 18 fileStream.Close();//註意關閉流,否則下麵的刪除會報錯 19 20 21 Thread.Sleep(1000); 22 File.Delete(filePath); 23 24 Console.ReadKey(); 25 } 26 27 private static void OnFileChange(object sender, EventArgs e) 28 { 29 MyEventAgrs arg = e as MyEventAgrs;//用於獲取文件的狀態 30 Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + arg.State); 31 } 32 }
運行結果:
三總結:
1、創建委托:
public delegate void 委托名(object sender, EventArgs e);
2、如果有獲取狀態,需要創建類,繼承EventArgs
3、創建事件:
public event 委托類型 事件名;
4、註冊事件,並添加其處理方法
部分引用來自:http://wayfarer.cnblogs.com/archive/2004/04/20/6712.html