C# 如何创建事件处理程序字典

C# 如何创建事件处理程序字典,c#,events,C#,Events,请注意,我不认为这是一个完整的副本。也有类似的例子 但没有一个问题能够以这种方式解决这个问题 我有多个线程在等待“取消”事件。但是Cancel事件包含一个键(algoIdent),允许我将回调指向特定线程 我想使用一个带有algoIdent键和回调委托值的字典 但是,我不知道如何创建事件的新实例(我不是指添加侦听器)。注释掉的代码显示了我如何为单个侦听器执行此操作,但我不知道在字典的值部分中放入什么。Add() public委托void delProcessCancel(字符串algoIdent

请注意,我不认为这是一个完整的副本。也有类似的例子 但没有一个问题能够以这种方式解决这个问题

我有多个线程在等待“取消”事件。但是Cancel事件包含一个键(algoIdent),允许我将回调指向特定线程

我想使用一个带有algoIdent键和回调委托值的字典

但是,我不知道如何创建事件的新实例(我不是指添加侦听器)。注释掉的代码显示了我如何为单个侦听器执行此操作,但我不知道在字典的值部分中放入什么。Add()

public委托void delProcessCancel(字符串algoIdent,字符串callBackMessage);
//公共事件delProcessCancel ProcessCancelListeners;
public Dictionary ProcessCancelListenerDict=新字典();
public void AddProcessCancelListener(字符串algoIdent,delProcessCancel\u delProcessCancel)
{
如果(!ProcessCancelListenerDict.ContainsKey(algoIdent))
{                    
processcancelistenerdict.Add(algoIdent,事件_delProcessCancel);
}
其他的
{
}
}

我已经回答了自己的问题,因为我认为您可以在新类中创建新事件。因此,我创建了一个wrpper

有人觉得这样做有问题吗

  public class ProcessCancelEventWrapper
    {
        public event delProcessCancel ProcessCancelListeners;

        public ProcessCancelEventWrapper(delProcessCancel _delProcessCancel)
        {
            ProcessCancelListeners += _delProcessCancel;
        }

        public void Raise(string algoIdent, string callBackMessage)
        {
            ProcessCancelListeners(algoIdent, callBackMessage);
        }
    }

    public delegate void delProcessCancel(string algoIdent,  string callBackMessage);

    public Dictionary<string, ProcessCancelEventWrapper> ProcessCancelListenerDict = new Dictionary<string, ProcessCancelEventWrapper>();


    public enum ListenerOption { Add, Delete, };
    public void ManageProcessCancelListener(string algoIdent, delProcessCancel _delProcessCancel, ListenerOption listenerOption)
    {
        if (listenerOption==ListenerOption.Add)
        {
            if (!ProcessCancelListenerDict.ContainsKey(algoIdent))
            {
                ProcessCancelListenerDict.Add(algoIdent, new ProcessCancelEventWrapper(_delProcessCancel));
            }
            else
            {
                ProcessCancelListenerDict[algoIdent].ProcessCancelListeners += _delProcessCancel;
            }                
        }
        else if (listenerOption == ListenerOption.Delete)
        {
            if (!ProcessCancelListenerDict.ContainsKey(algoIdent))
            {
            }
            else
            {
                ProcessCancelListenerDict[algoIdent].ProcessCancelListeners -= _delProcessCancel;
            }
        }

    }

    public void RaiseProcessCancelListener(string algoIdent, string callBackMessage)
    {
        if (!ProcessCancelListenerDict.ContainsKey(algoIdent))
        {
        }
        else
        {
            ProcessCancelListenerDict[algoIdent].Raise(algoIdent, callBackMessage);
        }
    }
公共类ProcessCancelEventWrapper
{
公共事件delProcessCancel ProcessCancelListeners;
公共ProcessCancelEventWrapper(delProcessCancel\u delProcessCancel)
{
ProcessCancelListeners+=\u delProcessCancel;
}
公共无效提升(字符串算法、字符串回调消息)
{
ProcessCancelListeners(algoIdent、callBackMessage);
}
}
公共委托void delProcessCancel(字符串algoIdent,字符串callBackMessage);
public Dictionary ProcessCancelListenerDict=新字典();
公共枚举列表器选项{Add,Delete,};
public void ManageProcessCancelListener(字符串algoIdent,delProcessCancel\u delProcessCancel,ListenerOption ListenerOption)
{
if(listenerOption==listenerOption.Add)
{
如果(!ProcessCancelListenerDict.ContainsKey(algoIdent))
{
Add(algoIdent,新的ProcessCancelEventWrapper(_delProcessCancel));
}
其他的
{
ProcessCancelListenerDict[algoIdent]。ProcessCancelListeners+=\u delProcessCancel;
}                
}
else if(listenerOption==listenerOption.Delete)
{
如果(!ProcessCancelListenerDict.ContainsKey(algoIdent))
{
}
其他的
{
ProcessCancelListenerDict[algoIdent]。ProcessCancelListeners-=\u delProcessCancel;
}
}
}
public void RaiseProcessCancelListener(字符串算法、字符串回调消息)
{
如果(!ProcessCancelListenerDict.ContainsKey(algoIdent))
{
}
其他的
{
ProcessCancelListenerDict[algoIdent].Raise(algoIdent,callBackMessage);
}
}

processcancelistenerdict.Add(algoIdent,_delProcessCancel)
将编译,但我真的不确定您想用它实现什么。为True,但值将是委托而不是事件。所以我不能解雇它我不明白你想干什么你这样是什么意思
ProcessCancelListenerDict[“ident”](algoIdent,callBackMessage)
?@DavidG。这只是调用委托,我希望它的工作方式与触发事件时完全相同。我认为你的版本会有线程交叉的问题
  public class ProcessCancelEventWrapper
    {
        public event delProcessCancel ProcessCancelListeners;

        public ProcessCancelEventWrapper(delProcessCancel _delProcessCancel)
        {
            ProcessCancelListeners += _delProcessCancel;
        }

        public void Raise(string algoIdent, string callBackMessage)
        {
            ProcessCancelListeners(algoIdent, callBackMessage);
        }
    }

    public delegate void delProcessCancel(string algoIdent,  string callBackMessage);

    public Dictionary<string, ProcessCancelEventWrapper> ProcessCancelListenerDict = new Dictionary<string, ProcessCancelEventWrapper>();


    public enum ListenerOption { Add, Delete, };
    public void ManageProcessCancelListener(string algoIdent, delProcessCancel _delProcessCancel, ListenerOption listenerOption)
    {
        if (listenerOption==ListenerOption.Add)
        {
            if (!ProcessCancelListenerDict.ContainsKey(algoIdent))
            {
                ProcessCancelListenerDict.Add(algoIdent, new ProcessCancelEventWrapper(_delProcessCancel));
            }
            else
            {
                ProcessCancelListenerDict[algoIdent].ProcessCancelListeners += _delProcessCancel;
            }                
        }
        else if (listenerOption == ListenerOption.Delete)
        {
            if (!ProcessCancelListenerDict.ContainsKey(algoIdent))
            {
            }
            else
            {
                ProcessCancelListenerDict[algoIdent].ProcessCancelListeners -= _delProcessCancel;
            }
        }

    }

    public void RaiseProcessCancelListener(string algoIdent, string callBackMessage)
    {
        if (!ProcessCancelListenerDict.ContainsKey(algoIdent))
        {
        }
        else
        {
            ProcessCancelListenerDict[algoIdent].Raise(algoIdent, callBackMessage);
        }
    }