zoukankan      html  css  js  c++  java
  • 增强的事件组件

    前 注:这是自己平时根据自己需要写的一些小代码,为了避免再次数据丢失,所以放到网上来,未必对各看官有用。另外,这是根据个人想法而写,未必严谨和符合设计原则,若有任何不妥之处,还请不吝赐教。

    特 性:

    1、可在事件所有者外部触发。

    2、增加Enabled属性用于禁用事件。使得无需清空响应和重新添加响应,便可达到暂时屏蔽事件的效果。

    3、可异步响应。.NET内置事件的响应在调用者线程上执行。

    4、事件委托限定为EventHandler<T>。

    说 明:

    1、一般情况下,在所有者外触发事件代表着不好的设计。事件既属于某个类,则触发它的权限自然也应属于且仅属于此类。但并非所有的情况都如此,例如有些事件既可通过界面操作触发,也可后台触发,甚至间接触发。

    2、此组件在内部封装一个.NET事件,为了初始化该事件,此组件本应为泛型,其参数为事件的委托。但出于以下原因或考虑:一、.NET的泛型无法限定为委托类型(Delegate);二、对外提供强类型控制;三、EventHandler<T>为微软推荐的事件响应委托。故将事件委托限定为EventHandler<T>,此组件的泛型参数对应EventHandler<T>中的T。

    示 例:略。

    源 码:

        /// <summary>
        /// 事件源类,此类相当于扩展的事件
        /// </summary>
        /// <typeparam name="T">事件参数类型</typeparam>
        public class EventSource<T> where T:EventArgs
        {
            #region Fields
    
            /// <summary>
            /// 事件对象
            /// </summary>
            private event EventHandler<T> _Event;
    
            /// <summary>
            /// 是否可用
            /// </summary>
            private bool _Enabled = true;
    
            /// <summary>
            /// 异步触发事件的线程池调用接口委托
            /// </summary>
            private WaitCallback _AsyncRaiseCallBack;
    
            #endregion
    
            #region Properties
    
            /// <summary>
            /// 事件对象
            /// </summary>
            public event EventHandler<T> Event
            {
                add
                {
                    this._Event += value;
                }
                remove
                {
                    this._Event -= value;
                }
            }
    
            /// <summary>
            /// 是否可用:若设置为true,则Raise函数将不会触发事件
            /// </summary>
            public bool Enabled
            {
                get { return _Enabled; }
                set { _Enabled = value; }
            }
    
            /// <summary>
            /// 异步触发事件的线程池调用接口委托
            /// </summary>
            private WaitCallback AsyncRaiseCallBack
            {
                get
                {
                    if (_AsyncRaiseCallBack == null)
                    {
                        _AsyncRaiseCallBack = new WaitCallback(RaiseEventCallBack);
                    }
                    return _AsyncRaiseCallBack;
                }
            }
    
            #endregion
    
            #region Methods
    
            /// <summary>
            /// 触发事件
            /// </summary>
            /// <param name="sender">发送方</param>
            /// <param name="args">参数</param>
            public void Raise(object sender, T args)
            {
                if (Enabled && _Event != null)
                {
                    _Event(sender, args);
                }
            }
    
            /// <summary>
            /// 异步触发事件
            /// </summary>
            /// <param name="sender">发送方</param>
            /// <param name="args">参数</param>
            /// <param name="Async">是否异步触发</param>
            public void Raise(object sender, T args,bool Async)
            {
                if (!Enabled || _Event == null) return;
    
                if (Async)
                {
                    Pair<object, T> context = new Pair<object, T>(sender, args);
                    ThreadPool.QueueUserWorkItem(AsyncRaiseCallBack, context);
                }
                else
                {
                    _Event(sender, args);
                }
            }
    
            /// <summary>
            /// 异步触发事件的线程池入口函数
            /// </summary>
            private void RaiseEventCallBack(object ThreadContext)
            {
                Pair<object, T> context = ThreadContext as Pair<object, T>;
                _Event(context.First, context.Second);
            }
    
            /// <summary>
            /// 添加响应
            /// </summary>
            /// <param name="Response">响应</param>
            /// <returns>事件源</returns>
            public static EventSource<T> operator +(EventSource<T> Source, EventHandler<T> Response)
            {
                Source.Event += Response;
                return Source;
            }
    
            /// <summary>
            /// 添加响应
            /// </summary>
            /// <param name="Response">响应</param>
            /// <returns>事件源</returns>
            public static EventSource<T> operator -(EventSource<T> Source, EventHandler<T> Response)
            {
                Source.Event -= Response;
                return Source;
            }
    
            /// <summary>
            /// 添加响应
            /// </summary>
            /// <param name="Response"></param>
            public void Add(EventHandler<T> Response)
            {
                this._Event += Response;
            }
    
            public void Remove(EventHandler<T> Response)
            {
                this._Event -= Response;
            }
    
            #endregion
        }
  • 相关阅读:
    HDU 1003 Max Sum
    HDU 1728 逃离迷宫
    UVA 10057 A midsummer night's dream.
    HDU 1232 畅通工程
    poj3331
    poj3481
    poj1053
    poj3281
    poj3199
    !!! Gridview的多种使用方法总结
  • 原文地址:https://www.cnblogs.com/yedaoq/p/1691236.html
Copyright © 2011-2022 走看看