最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 基于消息發(fā)布訂閱模型的示例(下)

 更新時間:2021年03月01日 08:53:22   作者:Hello——尋夢者!  
這篇文章主要介紹了C# 基于消息發(fā)布訂閱模型的示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

一 背景

  在上面的一篇文章中我們介紹了一個完整地基于消息發(fā)布和訂閱的模型,這篇文章我將介紹一種簡單的基于消息的發(fā)布和訂閱模型,在這個模型中我們將通過構(gòu)建一個Publisher類來完成對特定的事件和事件訂閱進(jìn)行封裝,這個是一個更加輕量級別的方式,使用這個的主要目的是降低類之間彼此的耦合程度,從而方便代碼的擴(kuò)展和訪問,最終使代碼結(jié)構(gòu)更加合理。

  我們首先來看看具體的Publisher類的構(gòu)成,后面我們將會對這個類做一個詳細(xì)的講解和分析。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Pangea.Common.Utility
{
    /// <summary>
    /// Publisher/Subscriber pattern
    /// This infrastructure works as an instance.
    /// </summary>
    public sealed class Publisher<EventType> where EventType : IComparable
    {
        private static readonly object _locker = new object();
 
        private static readonly Dictionary<EventType, List<Action<object, object, object, object>>> _eventTypeList = new Dictionary<EventType, List<Action<object, object, object, object>>>();
 
        public static void Attach(EventType key, Action<object, object, object, object> act)
        {
            lock (_locker)
            {
                if (!_eventTypeList.ContainsKey(key))
                    _eventTypeList.Add(key, new List<Action<object, object, object, object>>());
                if (!_eventTypeList[key].Contains(act))
                    _eventTypeList[key].Add(act);
            }
        }
 
        public static void Detach(EventType key)
        {
            lock (_locker)
            {
                if (_eventTypeList.ContainsKey(key))
                {
                    _eventTypeList[key].Clear();
                }
            }
        }
 
        public static void Detach(EventType key, Action<object, object, object, object> act)
        {
            lock (_locker)
            {
                if (_eventTypeList.ContainsKey(key) && _eventTypeList[key].Contains(act))
                {
                    _eventTypeList[key].Remove(act);
                }
            }
        }
 
        public static void Notify(EventType key, object p1, object p2, object p3, object p4)
        {
            lock (_locker)
            {
                if (_eventTypeList.ContainsKey(key))
                {
                    foreach (var act in _eventTypeList[key])
                    {
                        act.Invoke(p1, p2, p3, p4);
                    }
                }
            }
        }
 
        public static void Notify(EventType key, object p1, object p2, object p3)
        {
            Notify(key, p1, p2, p3, null);
        }
 
        public static void Notify(EventType key, object p1, object p2)
        {
            Notify(key, p1, p2, null, null);
        }
 
        public static void Notify(EventType key, object p1)
        {
            Notify(key, p1, null, null, null);
        }
 
        public static void Notify(EventType key)
        {
            Notify(key, null, null, null, null);
        }
    }
}

二 完成分析

  在上面的Publisher類中,我們使用了一個EventType類型的泛型參數(shù),這個參數(shù)由我們自己來進(jìn)行定義,一般定義為枚舉類型用于標(biāo)識我們唯一的事件類型,定義好了泛型參數(shù)后我們定義了一個_eventTypeList用于定義具體的EventType和對應(yīng)的處理方法并且將這個放到一個靜態(tài)的Dictionary中,當(dāng)然我們在代碼中一個事件可以對應(yīng)多個處理的Action,但是在一般情況下一個事件只有一個對應(yīng)的處理函數(shù),這里也不排除一個事件對應(yīng)多個事件的處理函數(shù),另外這里我們默認(rèn)定義了四個object類型的參數(shù),用于向處理函數(shù)進(jìn)行參數(shù)的傳遞,另外我們的方法都是靜態(tài)的方法并且在訂閱的過程中加了鎖從而保證了多線程的環(huán)境中保證線程的安全性。

三 使用過程

  在具體的使用過程中主要包括三個重要的步驟:1 定義事件類型。2  消息接收方訂閱事件處理(一般在構(gòu)造函數(shù)中調(diào)用Attach方法創(chuàng)建時間的唯一訂閱)。3  事件發(fā)布方發(fā)布事件(事件的發(fā)送方觸發(fā)時間并傳遞參數(shù),調(diào)用Notify方式觸發(fā)事件),完成以上三個步驟就完成了整個基于消息的發(fā)布訂閱的簡單處理,這個Publisher類在處理一般的事件方法中都能夠順利實(shí)現(xiàn),最重要的是事件本身簡單易于理解而且能最大程度上降低模塊間的耦合,所以在使用的時候還是非常方便的。

以上就是C# 基于消息發(fā)布訂閱模型的示例(下)的詳細(xì)內(nèi)容,更多關(guān)于c# 發(fā)布訂閱模型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用AOP實(shí)現(xiàn)SqlSugar自動事務(wù)

    利用AOP實(shí)現(xiàn)SqlSugar自動事務(wù)

    這篇文章主要為大家詳細(xì)介紹了利用AOP實(shí)現(xiàn)SqlSugar自動事務(wù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Unity UGUI的HorizontalLayoutGroup水平布局組件介紹使用

    Unity UGUI的HorizontalLayoutGroup水平布局組件介紹使用

    這篇文章主要為大家介紹了Unity UGUI的HorizontalLayoutGroup水平布局組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • C#利用delegate實(shí)現(xiàn)Javascript的each方法

    C#利用delegate實(shí)現(xiàn)Javascript的each方法

    這篇文章主要為大家介紹了介紹了C#利用delegate實(shí)現(xiàn)Javascript的each方法,感興趣的朋友可以參考一下
    2016-01-01
  • WPF實(shí)現(xiàn)自繪儀表盤Gauge

    WPF實(shí)現(xiàn)自繪儀表盤Gauge

    這篇文章主要為大家詳細(xì)介紹了如何使用WPF實(shí)現(xiàn)自繪儀表盤Gauge效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • 自定義WPF分頁控件的全過程記錄

    自定義WPF分頁控件的全過程記錄

    接觸WPF也有一段時間了,最近遇到了一個自定義分頁控件的功能,感覺可以分享下面,所以這篇文章主要介紹了自定義WPF分頁控件的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • c# DevExpress gridcontrol日期行的顯示格式設(shè)置

    c# DevExpress gridcontrol日期行的顯示格式設(shè)置

    這篇文章主要介紹了c# DevExpress gridcontrol日期行的顯示格式設(shè)置,需要的朋友可以參考下
    2017-02-02
  • 基于Unity Line Renderer組件的常用屬性說明

    基于Unity Line Renderer組件的常用屬性說明

    這篇文章主要介紹了基于Unity Line Renderer組件的常用屬性說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#?VB.NET?將Html轉(zhuǎn)為Excel

    C#?VB.NET?將Html轉(zhuǎn)為Excel

    本文介紹通過C#和VB.NET代碼展示將Html轉(zhuǎn)為Excel文檔的方法。文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定幫助,感興趣的小伙伴可以了解一下
    2022-03-03
  • 使用Npoi操作excel的解決辦法

    使用Npoi操作excel的解決辦法

    本篇文章,小編將為大家介紹,關(guān)于使用Npoi操作excel的解決辦法,有需要的朋友可以參考一下
    2013-04-04
  • 在Linux上運(yùn)行C#的方法

    在Linux上運(yùn)行C#的方法

    這篇文章主要介紹了在Linux上運(yùn)行C#的方法,實(shí)例分析了Linux平臺下Mono軟件包的應(yīng)用技巧,以及在此基礎(chǔ)之上的C#運(yùn)行方法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12

最新評論

屯留县| 黄陵县| 西乌| 嘉义县| 新兴县| 梅州市| 温泉县| 鹤壁市| 南部县| 沙田区| 娱乐| 昆山市| 上犹县| 修文县| 岑巩县| 林芝县| 萨迦县| 阿图什市| 贡觉县| 东兰县| 武功县| 红安县| 商城县| 扎鲁特旗| 韩城市| 中阳县| 甘肃省| 南京市| 疏附县| 崇仁县| 黎平县| 高清| 清原| 岳普湖县| 东海县| 仁寿县| 宽城| 吕梁市| 桦川县| 凤台县| 栾川县|