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
}
}
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
}
}