首页 > 解决方案 > 如何创建事件处理程序字典

问题描述

请注意,我不认为这是完全重复的。有类似的问题,但没有人设法以这种方式解决这个问题。

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

我想使用带有 algoIdent 键和 CallBack 委托值的字典。

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

public delegate void delProcessCancel(string algoIdent,  string callBackMessage);
//public event delProcessCancel ProcessCancelListeners;
public Dictionary<string, delProcessCancel > ProcessCancelListenerDict = new Dictionary<string, delProcessCancel>();

        public void AddProcessCancelListener(string algoIdent, delProcessCancel _delProcessCancel)
        {
            if (!ProcessCancelListenerDict.ContainsKey(algoIdent))
            {                    
                ProcessCancelListenerDict.Add(algoIdent, event _delProcessCancel );
            }
            else
            {

            }
        }

标签: c#events

解决方案


我已经回答了我自己的问题,因为我认为您可以在新班级中创建新活动。所以,我创建了一个包装器。

有没有人觉得这样做有问题?

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

推荐阅读