這也是今天討論到的乙個話題,其實還是比較簡單的。因為事件處理程式都是在主線程被執行的,所以主線程肯定是依次執行他們。那麼究竟是什麼決定了這個順序呢?
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.reflection;
using system.threading;
", thread.currentthread.managedthreadid);
employee e = new employee();
e.namechanged += new eventhandler(e_namechanged);
e.namechanged += new eventhandler(e_namechanged2);
e.name = "ares chen";
console.read();
}static
void e_namechanged2(object sender, eventargs e)
", datetime.now);
console.writeline("當前執行緒號是:", thread.currentthread.managedthreadid);
}static
void e_namechanged(object sender, eventargs e)
", datetime.now);
console.writeline("當前執行緒號是:", thread.currentthread.managedthreadid); }}
其實要深入看的話,這是因為事件的處理程式是通過乙個列表來管理的,就是eventhandlerlist
[hostprotection(securityaction.linkdemand, sharedstate=true)]
public
sealed
class eventhandlerlist : idisposable
internal eventhandlerlist(component parent)
public
void addhandler(object key, delegate value)
else
}public
void addhandlers(eventhandlerlist listtoaddfrom)
}public
void dispose()
private listentry find(object key)
head = head.next;
}return head;
}public
void removehandler(object key, delegate value)
}// properties
public delegate this[object key]
if (entry != null)
return
null;
}set
else}}
// nested types
private
sealed
class listentry
}}所以,既然是通過線性表來儲存的,那麼就有乙個先後順序的情況。其實,乙個更好的寫法是下面這樣的
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.reflection;
using system.threading;
using system.componentmodel;
", thread.currentthread.managedthreadid);
employee e = new employee();
e.namechanged += new eventhandler(e_namechanged);
e.namechanged += new eventhandler(e_namechanged2);
e.name = "ares chen";
console.read();
}static
void e_namechanged2(object sender, eventargs e)
", datetime.now);
console.writeline("當前執行緒號是:", thread.currentthread.managedthreadid);
}static
void e_namechanged(object sender, eventargs e)
", datetime.now);
console.writeline("當前執行緒號是:", thread.currentthread.managedthreadid); }}
class employee
remove
}private
string name;
public
string name
set);}}}
}}
為什麼使用eventhandlerlist? 這個問題之前就談論過,預設情況下,客戶端程式每為事件繫結乙個處理程式,就需要在型別中產生乙個delegate的引用,如此一來,如果事件很多的話,不利於較好地控制記憶體。但如果用eventhandlerlist的話,則有利於統一管理所有的delega 元素多個事件的處理順序
1.給dom元素繫結事件 2.簡單設定一下樣式 box3.通過js繫結事件,後面的事件會覆蓋前面的事件 var box document.getelementbyid box box.onclick function box.onclick function 4.通過jquery繫結事件,會按照順序...
MFC程式的訊息處理順序
mfc應用程式中處理訊息的順序 1.afxwndproc 該函式負責接收訊息,找到訊息所屬的cwnd物件,然後呼叫afxcallwndproc 2.afxcallwndproc 該函式負責儲存訊息 儲存的內容主要是訊息識別符號和訊息引數 用程式以後使用,然後呼叫windowproc 函式 3.win...
MFC程式的訊息處理順序
1.afxwndproc 該函式負責接收訊息,找到訊息所屬的cwnd物件,然後呼叫afxcallwndproc 2.afxcallwndproc 該函式負責儲存訊息 儲存的內容主要是訊息識別符號和訊息引數 用程式以後使用,然後呼叫windowproc 函式 3.windowproc 該函式負責傳送訊...