1. 程式人生 > >C#委托、事件、線程

C#委托、事件、線程

反射 事件處理 pro 處理程序 class 調用函數 操作 lis except

這是幾個簡單的例子,但是實際的開發中委托還還只在反射時用到過,事件的話只自己做了一次,並且還是特意去用的 ,實際上可以不用。線程的話,因為需要,所以用的會多點,這裏主要是WS上的線程。

委托

在前面的反射實例中,也有用到委托執行方法。

這個例子是將一個方法或者委托實例作為另外一個函數的入參傳遞。

至於有什麽用,我現在還沒用上。

 private delegate void Dosth(string s);//定義委托 無返回值 一個string參數
 private void button2_Click_1(object sender, EventArgs e)
  {
         
      Dosth dosth 
= new Dosth(Func);//實例化委托, DoMain(dosth);//DoMain(Func) 調用函數方法DoMain,入參可以是對應的方法Func也可以是委托實例化的後的dosth } private void Func(string s) { MessageBox.Show(s); } private void DoMain(Dosth fun) //方法DoMain 入參接收一個委托實例或者函數:返回值是空,入參是一個string { fun("hello world!"); }

事件

事件使用發布-訂閱模型,事件在類中申明且生成,通過使用同一個類或者其他類中的委托與事件處理程序關聯。

包含事件的類用於發布事件,被稱為發布器,其他接收該事件的類稱為訂閱器。

發布器中描述的是怎麽調用事件,也就是觸發事件,訂閱器中實際是事件具體的執行,最終要做什麽在訂閱器中完成。

這是一個實例。

發布器類

發布事件,定義觸發事件執行的邏輯的設定。

 public class Publish {
        private int value;
        public delegate void MyDelegate(string s);//申明委托
        public event MyDelegate MyEvent;//基於申明的委托定義事件
        public Publish()
        {
            value 
= 3; } public void CompairValue(int n) { if (n == value)//滿足條件 { OnValueChanged(); } } protected void OnValueChanged() { if (MyEvent != null) { MyEvent("hello world!");//觸發訂閱器中的方法執行 } } }

訂閱器類

被觸發時,做該做的事。

 public class Subscribe
    {
        public void ShowMessage(string s)
        {
            MessageBox.Show(s);//事件觸發,訂閱器中執行指定操作,更多的的操作可以在這個類中完成
        }
    }

觸發器

private void button3_Click(object sender, EventArgs e)
{
     Publish pub = new Publish();
     Subscribe sub = new Subscribe();
     pub.MyEvent += sub.ShowMessage;//或者new Publish.MyDelegate(sub.ShowMessage);   把訂閱器中的方法綁定到事件上,也就是註冊發布器中的事件
     pub.CompairValue(3);//當入參為3時,觸發事件,訂閱器中的方法則執行
}

線程

這裏的線程是WS上的線程

public void DoMain(){
static
object ThreadLock = new object(); public static Thread thread; lock (ThreadLock) { try { Boolean ThreadIsExit = thread.IsAlive;//如果報錯說明線程不存在 if (!ThreadIsExit) { thread.Start(); } } catch {try { thread = new Thread(new ThreadStart(Dosth));//開啟一個線程,回調函數SYNstart thread.IsBackground = true;//設置線程為後臺線程 thread.Start(); } catch (Exception ex) { } finally { } } finally { } }

}
public void Dosth(){


}

C#委托、事件、線程