none
請問,兩個相同物件的event都註冊同一個method的問題 RRS feed

  • 問題

  • 各位前輩好,

    有些地方不清楚,想請各位前輩解惑。

    我的認知是,new一個物件的時候,都會分配一塊記憶體,包含屬性、method。

    假設我有兩個button,分別為btn1與btn2,而click事件的method通常會這樣寫

    this.btn1.Click += btn1_Click;
    this.btn2.Click += btn2_Click;

    當我btn1與btn2同時click時,所處理的method是不一樣,不會互相干擾。

    那情況是,如果兩個btn的click都是註冊同一個method處理時,如下:

    this.btn1.Click += btn_Click;
    this.btn2.Click += btn_Click;

    這時候有一些疑惑出現,

    1. 請問兩個btn的click都是同一個method、同一塊記憶體處理嗎?

    2. 請問如果兩個btn的click「同時]觸發時,情況會是怎樣?(是否為先搶先贏,後來的等前面做完才能用,有點類似lock?)

    以上問題希望各位前輩解惑,謝謝。


    • 已編輯 笨嘎嘎 2015年4月21日 上午 08:57
    2015年4月21日 上午 08:41

解答

  • 先讀一下這篇文章吧:http://csharpindepth.com/Articles/chapter2/events.aspx

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 笨嘎嘎 2015年4月21日 上午 11:31
    2015年4月21日 上午 09:06
    版主
  • 除非你兩個 Event 觸發在不同的執行緒. 否則事件是照順序執行的. 不論其委派函式是否相同.

    當一個事件被觸發, 會先放在該執行緒內的事件佇列中, 如果他是事件佇列的第一個, 就會開始執行其委派方法. 如果不是第一個, 他就得等前面所有的事件被處理完畢才會輪到他呼叫方法.

    另外, Application.DoEvnet 會強迫事件佇列把事件吐出來執行其委派方法.

    還有一點, 你的認知是錯誤的

    方法 Method 和屬性 Property (其實屬性是方法的變形)  會掛在 Type Object 上而不是 Instance. 成員欄位 (Field) 才會掛在 Instance 上面. 而且每次呼叫方法時, 只要是在方法內的區域變數, 都會每次呼叫後在 Thread Stack 中產生一個新的, 不會共用.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 笨嘎嘎 2015年4月21日 上午 11:31
    2015年4月21日 上午 10:42
    版主

所有回覆

  • 先讀一下這篇文章吧:http://csharpindepth.com/Articles/chapter2/events.aspx

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 笨嘎嘎 2015年4月21日 上午 11:31
    2015年4月21日 上午 09:06
    版主
  • 除非你兩個 Event 觸發在不同的執行緒. 否則事件是照順序執行的. 不論其委派函式是否相同.

    當一個事件被觸發, 會先放在該執行緒內的事件佇列中, 如果他是事件佇列的第一個, 就會開始執行其委派方法. 如果不是第一個, 他就得等前面所有的事件被處理完畢才會輪到他呼叫方法.

    另外, Application.DoEvnet 會強迫事件佇列把事件吐出來執行其委派方法.

    還有一點, 你的認知是錯誤的

    方法 Method 和屬性 Property (其實屬性是方法的變形)  會掛在 Type Object 上而不是 Instance. 成員欄位 (Field) 才會掛在 Instance 上面. 而且每次呼叫方法時, 只要是在方法內的區域變數, 都會每次呼叫後在 Thread Stack 中產生一個新的, 不會共用.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 笨嘎嘎 2015年4月21日 上午 11:31
    2015年4月21日 上午 10:42
    版主
  • 感謝樓上兩位版主回答,

    學習到了不少,謝謝^^

    2015年4月21日 上午 11:31