[英]Prioritising Event Handlers
我有以下代碼,我處理一個事件兩次。 但是,我總是希望確保mynewclass
始終首先處理事件,然后觸發本地事件處理程序代碼。 我理解MyClass事件應首先觸發,因為它是首先創建的事件,但因為線程和入隊正在發生,我認為它花了太長時間並且在我想要它之前在myhandleeventlocal
做了一些事情。 我能等待它發生的任何方式嗎?
public MyMainClass
{
private MyMethod()
{
MyClass mynewclass = new MyClass();
mynewclass.myObject += MyHandler(myhandleventlocal);
mynewclass.loadedevent += EventHandler(loadedevent)
}
private void myhandleventlocal()
{
//do stuff
}
private void loadedevent()
{
//do some stuff
}
}
public MyClass
{
public MyObject myObject;
public event loadedevent;
public MyClass()
{
myObject = new MyObject();
myObject += MyHandler(myhandlevent);
}
private void myhandlevent(long value, string detail)
{
//Start a thread
//Enqueue value and detail
//On seperate thread dequeue value and process it
//Raise loadedevent event
}
}
更新:我已更新我的問題和代碼以證明問題。
默認情況下 ,事件處理程序按您添加它們的順序調用,因此如果您始終按照您希望它們觸發的順序添加處理程序,那么它應該可以工作。
來自Jon Skeet關於活動和代表的文章:
[...]額外的代表被添加到列表的末尾並從中刪除[...]
注意:您可以通過更改事件的add
和remove
操作來覆蓋事件的默認行為,以指定其他一些行為。 然后,您可以將事件處理程序保存在您自己管理的列表中,並根據您喜歡的規則處理觸發順序。
如果您不能保證訂單將添加事件處理程序,只需為mynewclass
添加一個,然后在該代碼中調用其他代碼。
由於事件處理程序是按照您添加它們的順序調用的,因此根據我在您的問題中看到的代碼,您無法首先調用mynewclass的處理程序。 始終首先添加MyClass創建的事件處理程序。
一種解決方案是控制事件處理程序的優先級。 您可以使用添加和刪除事件的方法來代替使用內置事件處理程序+ = / - =運算符,您可以在其中明確指定排序。 這樣,如果一個類知道它需要首先處理事件,它可以要求這樣做。 但要小心,因為您可能很容易遇到多個類都堅持要先處理事件的情況。
這里有一些快速而又臟的代碼可以幫助您入門:
class MyClass {
private LinkedList<MyEventHandler> eventHandlers;
public enum Ordering { First, Last, ... };
public void AddHandler(MyEventHandler handler, Ordering order) {
switch(order) {
case Ordering.First:
eventHandlers.AddFirst(handler);
break;
// fill in other cases here...
}
}
public void RaiseEvent() {
// call handlers in order
foreach(MyEventHandler handler in eventHandlers)
eventHandler();
}
}
參考siride解決方案,您還可以實現處理程序並以此方式確定位置。 像反轉順序(總是在開頭添加)或添加一些邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.