亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

.NET事件監聽機制的局限與擴展分析

2024-07-10 13:28:31
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了.NET事件監聽機制的局限與擴展,詳細分析了.NET事件監聽機制的機制與優劣,有助于更好的理解.NET的運行原理,需要的朋友可以參考下
 
 

本文實例分析了.NET事件監聽機制的局限與擴展。分享給大家供大家參考。具體分析如下:

.NET中把“事件”看作一個基本的編程概念,并提供了非常優美的語法支持,對比如下C#和Java代碼可以看出兩種語言設計思想之間的差異。

復制代碼代碼如下:
// C#
someButton.Click += OnSomeButtonClick;

復制代碼代碼如下:
// Java
someButton.addActionListener(
    new ActionListener(){
        public void actionPerformed(){
            ...
        }
});

 

在我們的軟件中就大量使用事件來對監聽者與發布者解耦,但也遇到了一些局限,在這里跟大家分享一二。一是無法保證監聽者的調用順序;二是當監聽者很多時的監聽、解除監聽的效率問題。
 
事件監聽者的調用順序

.NET的事件監聽機制對監聽者的調用順序沒有明確的保證,但有時我們卻要求保證不同組件之間的處理順序。比如,在我們的軟件中使用類似解釋器模式的方式來實現用戶交互操作,一個稱作交互源的組件負責將UI控件上的事件分派給一組稱為交互器的組件,這些組件依照事先確定的優先級依次獲得事件處理的機會,只有當具有高優先級的交互器沒有處理事件時,低優先級的組件才能執行進一步的處理。這樣,我們就能在不同業務功能的實現中通過以不同的順序組織交互器來重用它們。比如,重用一些基本的視圖縮放、平移、菜單處理等功能。
 
在上述場景下,如何保證交互器間事件處理的順序就變得很重要了。當然如果你看一下MulticastDelegate的源代碼的話,可以知道在當前的實現中其實各個監聽者還是有一定的調用順序的。但一來這屬于實現細節,在將來完全可能改變;二來如果不同的監聽器位于不同的模塊中時,要依賴于這一實現而保證它們之間的調用順序也是很困難的。
 
在這里我們借鑒了Java中以接口進行事件處理的方式,并在添加監聽器的同時接收一個表示優先級的參數,這樣就可以明確的維護各個監聽器的順序了,如下面的代碼所示。我們在交互器(IInteractor)接口中為每一個UI事件定義了相應的方法,并且讓InteractSource負責將控件上的事件轉化為對接口中相應方法的調用。

復制代碼代碼如下:
public class InteractSource
{
    public void AddInteractor(int priority, IInteractor interactor) 
    {
    }
}
 
public interface IInteractor
{
    public void OnMouseDown(MouseEventArgs e)
    {
    }
    
    ... ...
}

 

監聽器添加與移除的效率

MulticastDelegate是我們平常使用的事件(event)機制背后的實現,通過其源代碼可以看到,它在內部使用數組保存了對各個監聽器的引用。這就會造成一個問題——當對一個事件的監聽器數目很多時,添加和移除監聽器的效率將會變得非常低。以移除為例,對于有N個監聽器的事件來說,平均要進行N/2次比較才能確定監聽器的位置,而且還要有額外的數組整理操作。為了解決這一情況,我們先是嘗試自行定義事件的添加、移除邏輯,并在內部嘗試使用字典、哈希表等多種方式進行存儲,但事實證明,雖然二者在時間復雜度上有優勢,不過其實際效率還是達不到要求。
 
最好狀態下是要有一種能在常數時間內添加和移除監聽器的數據結構,也許你也想到了——雙向鏈表。
 
也許你又想到了——在雙向鏈表中添加和刪除是常數時間,但查找卻仍然是O(n)的復雜度。
 
使用接口形式的設計方式再次展現了其靈活性,我們可以將事件發布者的設計為如下形式(示意代碼):

復制代碼代碼如下:
public class EventSource
{
    private LinkedList list = new LinkedList();
 
    public Tocken AddListener(IEventListener listener)
    {
        LinkedListNode n = new LinkedListNode(listener);
        list.AddLast(n);
        return new Tocken(node);
    }
 
    public void RemoveListener(Tocken tocken)
    {
        list.Remoe(tocken.node);
    }
 
    public class Tocken
    {
        internal LinkedListNode node;
    }
}

 

在此類中使用雙向鏈表存儲已經添加的監聽器,而在AddListener方法每次調用時都將所添加的鏈表節點保存到一個令牌(Token)中返回。監聽者需要保存這個令牌,并使用它來解除監聽。當然,監聽者完全可以忽略令牌是個什么東西,就像地鐵票從來就是只是一張票而已,我們不曾關心它包含著什么信息。不過對于發布者來說卻可以將一些定位信息保存在其中,從而在解除監聽時充分利用,在上面的代碼中我就保存了鏈表節點的引用,從而達到監聽者的添加、定位、移除都在常數時間內完成。
 
當然,還可以在Tocken中保存發布者的引用,這樣就可以發現”取消對一個從來沒有監聽過的對象的監聽“這樣的BUG?;蛘?,還有其它信息。

希望本文所述對大家的C#程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产99精品国自产| 中国人与牲禽动交精品| 夜夜躁日日躁狠狠久久88av| 欧美日韩午夜激情| 国产精品成人一区| 欧美日韩久久久久| 久久久久久国产精品| 中文字幕日韩欧美| 亚洲综合在线中文字幕| 国产精品视频999| 91精品国产高清久久久久久| 日韩中文字在线| 国产99久久精品一区二区| 亚洲欧美一区二区精品久久久| 欧美电影免费观看大全| 国产精品日韩在线| 毛片精品免费在线观看| 欧美精品在线播放| 亚洲第一色中文字幕| 伦伦影院午夜日韩欧美限制| 国内精品久久久久伊人av| 亚洲天堂av女优| 成人在线视频福利| 91情侣偷在线精品国产| 欧美中在线观看| 国产一区深夜福利| 国产69久久精品成人看| 欧美成人精品激情在线观看| 亚洲美女福利视频网站| 亚洲网站在线看| www欧美xxxx| 日韩欧美成人精品| 久久综合国产精品台湾中文娱乐网| 亚洲free性xxxx护士hd| 精品久久久久久久久久久久久| 九九热99久久久国产盗摄| 欧美一区二区三区艳史| 亚洲国产私拍精品国模在线观看| 亚洲午夜未满十八勿入免费观看全集| 日韩亚洲精品视频| 亚洲欧美日韩中文视频| 97国产精品免费视频| 国模吧一区二区| 影音先锋欧美在线资源| 亚洲人成绝费网站色www| 国产精品吹潮在线观看| 日韩亚洲第一页| 国产91免费观看| 亚洲人免费视频| 日韩精品在线视频美女| 热久久这里只有| 欧美成aaa人片在线观看蜜臀| 国自产精品手机在线观看视频| 97在线精品视频| 中文字幕免费精品一区高清| 性欧美视频videos6一9| 亚洲一级片在线看| 亚洲字幕在线观看| 亚洲色图日韩av| 日韩在线视频中文字幕| 亚洲人成网站色ww在线| 精品国产欧美一区二区三区成人| 国产精品1区2区在线观看| 欧美日韩一区二区三区| 日韩av在线看| 国产性猛交xxxx免费看久久| 国内精品久久久久影院优| 97国产精品视频人人做人人爱| 日韩在线欧美在线国产在线| 久久久久久综合网天天| 韩剧1988免费观看全集| 久久综合国产精品台湾中文娱乐网| 欧美成人午夜激情视频| 欧美高清视频免费观看| 日韩免费精品视频| 亚洲区一区二区| 亚洲精选在线观看| 久久久精品久久久| 中文字幕免费国产精品| 久久久精品亚洲| 国产精品96久久久久久又黄又硬| 国产综合色香蕉精品| 91综合免费在线| 欧美另类极品videosbestfree| 久久色免费在线视频| 欧美壮男野外gaytube| 亚洲一级一级97网| 97在线视频精品| 亚洲国产精品国自产拍av秋霞| 亚洲一区二区中文字幕| 欧美精品一区二区三区国产精品| 日韩男女性生活视频| 亚洲国产99精品国自产| 日韩a**站在线观看| 狠狠干狠狠久久| 亚洲欧美一区二区精品久久久| 精品小视频在线| 欧美高清在线视频观看不卡| 国产精品一区二区久久精品| 97国产精品人人爽人人做| 日韩欧美在线观看| 色综合伊人色综合网| 久久人人看视频| 久久久久久亚洲精品不卡| 亚洲视频在线观看网站| 日韩在线播放视频| 国产精品久久久久久久久久久新郎| 欧美一区二区三区精品电影| 日韩精品免费一线在线观看| 日韩精品高清视频| 国产午夜精品一区理论片飘花| 久久精品一本久久99精品| 亚洲香蕉伊综合在人在线视看| 亚洲电影av在线| 日韩电影在线观看免费| 136fldh精品导航福利| 国产丝袜精品第一页| 精品亚洲一区二区三区在线播放| 中文字幕日韩免费视频| 欧美高清视频在线观看| 欧美国产日韩xxxxx| 欧美韩国理论所午夜片917电影| 久久久免费高清电视剧观看| 久久久成人av| 日韩电影在线观看中文字幕| 国产91精品视频在线观看| 日韩电影中文 亚洲精品乱码| 亚洲xxxx视频| 最近2019中文字幕大全第二页| 成人亲热视频网站| 一区二区三区回区在观看免费视频| 欧美日韩国产第一页| 欧美极品少妇全裸体| 成人动漫网站在线观看| 国产91精品黑色丝袜高跟鞋| 最近2019免费中文字幕视频三| 国产精品久久久久久中文字| 精品成人国产在线观看男人呻吟| 成人午夜黄色影院| 亚洲欧洲日产国码av系列天堂| 亚洲自拍偷拍色片视频| 日本一区二区在线免费播放| 亚洲精品在线不卡| 亚洲视频在线观看视频| 欧美重口另类videos人妖| 亚洲风情亚aⅴ在线发布| 91精品国产91| 中文字幕在线精品| 国产精品成人播放| 亚洲天天在线日亚洲洲精| 91精品国产乱码久久久久久久久| 欧美三级欧美成人高清www| 97精品一区二区视频在线观看| 一本色道久久综合狠狠躁篇的优点| 欧美亚洲第一区| 红桃av永久久久| 欧美日韩国产一区二区三区| 国产第一区电影| 在线播放日韩欧美| 精品久久久久久久久久| 欧美精品在线观看91| 2019中文字幕在线| 久久网福利资源网站| 45www国产精品网站|