事件的触发者A,是一个队列,队列如果有新内容加入的话,则触发一个事件,,,,事件的侦听是多个对象C,写在了一个的List<C>里,有一个线程在循环检查List<C>里C的状态,移除List<C>中状态不对的C,
所有的C对象,都对A进行侦听,如果A触发事件后,所有的C要检查这个A触发的事件是不是自己的,就是C对象要认领这个事件,如果不是自己的,C就不执行,还留在List<C>中,如果是自己的则C执行对应的方法,将自己从List<C>中移除。。
大家帮忙,看一下,这样的想法有没有什么问题,或者哪有类似的贴子有这种东西的实现,,我是不知道怎么写好了
还有这种,多对象对一个对象的侦听会不会很耗资源。

解决方案 »

  1.   

    为什么必须要事件?
      直接把A和C分成两个队列,输入添加时,从头让每一个C检查是否是自己的数据。直到有一个检查成功。
    即使需要A和C分开管理,也应该是C成为一个集合然后在集合上执行A内容归属检测。--- 为了设计而设计??
      

  2.   


    A是RabbitMQ的队列,,,,,,看到你说,我觉的也是,应该把事件加在包含有List<C>的集合上实例上,A触发事件,包含有List<C>的集合实例,响应事件,去检查自己的List<C>,找到对应的C后,修改C中的值。
      

  3.   

    不要用List<C>,有现成的类:System.Collections.ObjectModel.ObservableCollection<C>
    这个类有个CollectionChanged事件,集合改变时会触发。
      

  4.   

    或者自己包装一个List<C>对象,实现INotifyCollectionChanged, INotifyPropertyChanged接口。
    ----------
    然后你的C对象中订阅集合的CollectionChanged事件。
      

  5.   


    List<C>的集合改变不用触发事件,,,A的队列改变要触发一下事件,A是RabbitMQ
      

  6.   

    你的意思是,A伸出脸来让一个List的C来打,哪个C打了就跑?
      

  7.   

    A伸出脸来让指定一个List的C来打,
      

  8.   

    你这句话(红色标记):
    事件的侦听是多个对象C,写在了一个的List<C>里,有一个线程在循环检查List<C>里C的状态,移除List<C>中状态不对的C,如果是这样的需求,用System.Collections.ObjectModel.ObservableCollection<C>绝对能够满足你,在集合中添加/移除C等操作时都可以触发CollectionChanged事件,在CollectionChanged事件中就可以知道你操作的是哪个C,你再调用相应C的方法不就行了?
    而且你这样也没必须用C来订阅A的事件。
    ----------
      

  9.   

    lz的前提条件是包含A的队列发生变化的时候发事件,包含有C的队列是订阅事件,实现ObservableCollection<C>有啥用?
      

  10.   

    前段时间学android,你说的有点像他的广播机制。
    实现一个C广播,并且制定C的接受条件,然后像android注册这个广播。
    android有广播的时候,会向已注册,并符合条件的广播发送通知。
      

  11.   


    呵呵,表达能力有点差,,A就是一个消息队列,队列中的内容就是,u1对u2说发了消息,队列中就会加一条记录,u3对u5发了消息也要加一条记录,,,
    List<C>,就是所有用户连接上来的实例,List<C>{u1,u2,u3,u4}这样的,,,一个线程去检查List<C>里的实例状态,如果有人断开了,就把这个实例 从List<C>中删除,,
    A的消息队列中如果队列中有新的消息,,则就触发一个事件,说有新的消息了,,让List<C>里的实例来认领,这个新是消息,是谁对谁说的,,,比如是 u1对u2说的,就要在List<C>中找到u2,把u1给他发的消息,传递过去。
      

  12.   

    //定义委托
    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 == ....)
            ......
        }
    }
      

  13.   


    谢谢你,请问一下,,在这个包含List<C>的类中,还有一个线程在监控着List<C>的状态,,这样再添加一个回调函数,性能上应该没有什么问题吧。
      

  14.   

    监控list<c>状态的线程作用是什么??如果是list<c>的状态改变了,就执行一些其他操作的话,可以把功能放在回调函数里一起执行。回调函数也是在list<c>的状态有所改变(有新消息加入了)的情况下执行的
      

  15.   

    一个线程去检查List<C>里的实例状态,如果有人断开了,就把这个实例 从List<C>中删除,,刚才看了下,这个貌似不能在回调函数里做。
    最好有一个机制是:一旦有人断开,就去执行删除list<c>,而不是线程去检查list<c>的状态,检查是需要耗资源的
      

  16.   

    另一线程去检查List<C>里的实例状态时,List<C>加锁,触发事件时候,要修改List<C>里C的属性是否用加锁呢?