日期:2014-05-18  浏览次数:20880 次

多实例对一个对象的事件侦听,应该怎么写好?
事件的触发者A,是一个队列,队列如果有新内容加入的话,则触发一个事件,,,,



事件的侦听是多个对象C,写在了一个的List<C>里,有一个线程在循环检查List<C>里C的状态,移除List<C>中状态不对的C,
所有的C对象,都对A进行侦听,如果A触发事件后,所有的C要检查这个A触发的事件是不是自己的,就是C对象要认领这个事件,如果不是自己的,C就不执行,还留在List<C>中,如果是自己的则C执行对应的方法,将自己从List<C>中移除。。




大家帮忙,看一下,这样的想法有没有什么问题,或者哪有类似的贴子有这种东西的实现,,我是不知道怎么写好了。。。
还有这种,多对象对一个对象的侦听会不会很耗资源。

------解决方案--------------------
或者自己包装一个List<C>对象,实现INotifyCollectionChanged, INotifyPropertyChanged接口。
----------
然后你的C对象中订阅集合的CollectionChanged事件。
------解决方案--------------------
lz的前提条件是包含A的队列发生变化的时候发事件,包含有C的队列是订阅事件,实现ObservableCollection<C>有啥用?
------解决方案--------------------
//定义委托
public delegate void NewsJoinQueueHandler(string flag);
//在新消息加入队列的类中定义事件
private event NewsJoinQueueHandler onNewsJoinQueue;
public event NewsJoinQueueHandler NewsJoinQueue
{
add { onNewsJoinQueue += value; }
remove { onNewsJoinQueue -= value; }
}
//在新消息加入队列的类中添加执行事件的方法
private void OnNewsJoinQueue(string flag)
{
NewsJoinQueueHandler handler = onNewsJoinQueue;
if (handler != null)
handler(flag);
}

//在新消息加入队列的类中,应该是有一个方法来把消息加入到队列
private void AddNewMsgToQueue()
{
//这个方法体我写得抽象一点
队列.添加(消息);
//这里需要写触发事件的方法,flag是List<C>中C对象判断是否是自己的条件 OnNewsJoinQueue(flag);
}

//在包含List<C>的类中,订阅事件
新消息加入队列的类的实例.NewsJoinQueue += new NewsJoinQueueHandler(CallbackFunction);

//在包含List<C>的类中,添加回调函数,判断List<C>
private void CallbackFunction(string flag)
{
foreach(......)
{
if(flag == ....)
......
}
}
------解决方案--------------------
委托就可以了