毕竟,我最近遇到了订阅/取消订阅的并发性并且通知我试图将我高在一个泛型类并使用它。
唉,我找不到办法,因为这是不允许的:
public class LCLMulticastEvent<T> where T: System.MulticastDelegate
{
private event T internalEvent;
private object lockObject = new object();
public event T OnEvent
{
add
{
lock( lockObject )
{
internalEvent += value;
}
}
remove
{
lock( lockObject )
{
internalEvent += value;
}
}
}
public void notify( params object[] args)
{
if( internalEvent != null )
{
lock( lockObject )
{
foreach( T invokee in internalEvent.GetInvocationList() )
{
invokee.DynamicInvoke( args );
}
}
}
}
}
编译器拒绝接受System.MulticastDelegate
,说这是一个特殊的类......
有什么办法吗?
编辑:我在第一次赎罪时试图过于简短。 我想要的是实现一种线程安全的事件包装器。 @Thomas:DynamicInvoke应该是解决方案......
TIA
马里奥
答案 0 :(得分:1)
我不清楚你要在这里实现什么,但也许这会有所帮助:你可以在EventArgs
类型而不是MultiCastDelegate
public class LCLMulticastEvent<TEventArgs> where TEventArgs : EventArgs
{
private event EventHandler<TEventArgs> internalEvent;
private object lockObject = new object();
public event EventHandler<TEventArgs> OnEvent
{
add { internalEvent += value; }
remove { internalEvent -= value; }
}
}