C#委托、事件、線程


這是幾個簡單的例子,但是實際的開發中委托還還只在反射時用到過,事件的話只自己做了一次,並且還是特意去用的 ,實際上可以不用。線程的話,因為需要,所以用的會多點,這里主要是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));//開啟一個線程,回調函數Dosth thread.IsBackground = true;//設置線程為后台線程 thread.Start(); } catch (Exception ex) { } finally { } } finally { } }

}
public void Dosth(){


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM