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; }
}
private static void UnSafeFire(Delegate del, params object[] args)
{
if (null == del)
{
return;
}
int id = Thread.CurrentThread.ManagedThreadId;
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);
}
}