支持异步事件的 EventHelper

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.ComponentModel;


namespace xj.utility
{
    public class EventHelper
    {
        private static SynchronizationContext m_sc;
        public static void Init()
        {
            SC = SynchronizationContext.Current;
        }
        private static SynchronizationContext SC
        {
            get { return m_sc; }
            set { m_sc = value; }
        }
        #region 同步调用事件
        private static void UnSafeFire(Delegate del, params object[] args)
        {
            if (null == del)
            {
                return;
            }
            //ISynchronizeInvoke syn=del.Target as ISynchronizeInvoke;
            需要线程亲和性
            //if (null != syn)
            //{
            //    if (syn.InvokeRequired)
            //    {


            //        syn.Invoke(
            //    }


            //}
          
            Delegate[] delegates = del.GetInvocationList();
            //如果不是主线程发生的事件
            if (null==SynchronizationContext.Current)
            {
                if (null == SC) return;
                foreach (Delegate sink in delegates)
                {
                    try
                    {                       
                        SC.Post(delegate
                        {
                            sink.DynamicInvoke(args);
                        }, null);
                    }
                    catch { }
                }
            }
            else
            {              
                foreach (Delegate sink in delegates)
                {
                    try
                    {
                        sink.DynamicInvoke(args);
                    }
                    catch { }                  
                }
            }
        }       
        public static void Fire<T>(Action<T> del, T t)
        {           
            UnSafeFire(del, t);
        }
        public static void Fire<T,U>(Action<T,U> del, T t,U u)
        {
            UnSafeFire(del, t,u);
        }
        public static void Fire<T, U, V>(Action<T, U, V> del, T t, U u, V v)
        {
            UnSafeFire(del, t, u,v);
        }
        public static void Fire<T, U, V, W>(Action<T, U, V, W> del, T t, U u, V v, W w)
        {
            UnSafeFire(del, t, u, v,w);
        }
        public static void Fire<T, U, V, W, X>(Action<T, U, V, W, X> del, T t, U u, V v, W w, X x)
        {
            UnSafeFire(del, t, u, v, w,x);
        }
        public static void Fire<T, U, V, W, X, Y>(Action<T, U, V, W, X, Y> del, T t, U u, V v, W w, X x, Y y)
        {
            UnSafeFire(del, t, u, v, w, x,y);
        }
        public static void Fire<T, U, V, W, X, Y, Z>(Action<T, U, V, W, X, Y, Z> del, T t, U u, V v, W w, X x, Y y, Z z)
        {
            UnSafeFire(del, t, u, v, w, x, y,z);
        }
        #endregion
        #region 异步调用事件


        delegate void AsyncFire(Delegate del, object[] args);
        private static void InvokeDelegate(Delegate del, object[] args)
        {
            del.DynamicInvoke(args);
        }
        private static void UnSafeFireAsync(Delegate del, params object[] args)
        {
            if (null == del)
            {
                return;
            }
            Delegate[] delegates = del.GetInvocationList();
            AsyncFire asyncFire = InvokeDelegate;
            foreach (Delegate sink in delegates)
            {
                try
                {
                    asyncFire.BeginInvoke(sink,args,null,null);
                }
                catch { }
            }         
        }
        public static void FireAsync<T>(Action<T> del, T t)
        {
            UnSafeFireAsync(del, t);
        }
        public static void FireAsync<T, U>(Action<T, U> del, T t, U u)
        {
            UnSafeFireAsync(del, t, u);
        }
        public static void FireAsync<T, U, V>(Action<T, U, V> del, T t, U u, V v)
        {
            UnSafeFireAsync(del, t, u, v);
        }
        public static void FireAsync<T, U, V, W>(Action<T, U, V, W> del, T t, U u, V v, W w)
        {
            UnSafeFireAsync(del, t, u, v, w);
        }
        public static void FireAsync<T, U, V, W, X>(Action<T, U, V, W, X> del, T t, U u, V v, W w, X x)
        {
            UnSafeFireAsync(del, t, u, v, w, x);
        }
        public static void FireAsync<T, U, V, W, X, Y>(Action<T, U, V, W, X, Y> del, T t, U u, V v, W w, X x, Y y)
        {
            UnSafeFireAsync(del, t, u, v, w, x, y);
        }
        public static void FireAsync<T, U, V, W, X, Y, Z>(Action<T, U, V, W, X, Y, Z> del, T t, U u, V v, W w, X x, Y y, Z z)
        {
            UnSafeFireAsync(del, t, u, v, w, x, y, z);
        }
        #endregion
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值