事件處理程式的處理順序問題

2021-05-23 08:46:17 字數 3035 閱讀 7500

這也是今天討論到的乙個話題,其實還是比較簡單的。因為事件處理程式都是在主線程被執行的,所以主線程肯定是依次執行他們。那麼究竟是什麼決定了這個順序呢?

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 該函式負責傳送訊...