c# - 如何创建事件处理程序字典
问题描述
请注意,我不认为这是完全重复的。有类似的问题,但没有人设法以这种方式解决这个问题。
我有多个线程等待“取消”事件。但是 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
{
}
}
解决方案
我已经回答了我自己的问题,因为我认为您可以在新班级中创建新活动。所以,我创建了一个包装器。
有没有人觉得这样做有问题?
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);
}
}
推荐阅读
- javascript - 错误来自护照本地猫鼬,运行我用节点 js 编写的 app.js 文件时的节点模块
- c# - 发出 POST 请求
- robotframework - 在测试用例中添加 300 秒的睡眠时,机器人测试用例的执行没有结束
- javascript - window.open 不工作解析 URL 被截断
- c++ - Arduino c+ >> 操作
- html-agility-pack - 忽略一些 TR 节点
- java - Java:具有可运行成员的对象的深层副本和复制构造函数
- c - 因为使用数学时编译需要时间,这标志着我的错误
- sql - 从具有相同外键的所有行中的列值之一大于给定值的表中选择外键
- numpy - 从 NumPy 数组中获取按列的最大值