在管理器类型类中注册事件

时间:2013-05-07 02:41:06

标签: c# events

我仍然是这方面的初学者,我正在努力更好地了解事件以及如何正确使用它们。

我有一个管理器类,它有一个存储一堆对象的容器;每个对象都有一个事件(基本上说它完成了它做的事情)。我希望manager类能够订阅事件,并在事件触发时从容器中删除对象。

当你注册一个对象的事件时,它是注册该对象的所有实例,还是它是特定于实例的?

所以这就是我所看到的:

 class MyManager
{
    private ConcurrentDictionary<string, MyObject> m_myObjectCollection;

    public MyManager()
    {
        m_myObjectCollection = new ConcurrentDictionary<string, MyObject>();


    }


    private void RemoveObject(MyObject myObject)
    {
        //remove object from collection
    }
}


class MyObject
{      

    public delegate void MyObjectFinished_EventHandler(object source, EventArgs e);

    public event MyObjectFinished_EventHandler OnFinished;

    public MyObject()
    {

        this.OnFinished += new MyObjectFinished_EventHandler(MyObject_OnFinished);

    }

    private void MyObject_OnFinished(object source, EventArgs e)
    {
        //do some clean up stuff
    }

    private void DoStuff()
    {
        //do stuff until finished
        OnFinished(this, new EventArgs());
    }

让管理器类创建MyObject的实例然后注册该对象的事件是否足够?这对我来说似乎不对;我的直觉说我只会注册那个对象的事件,而不是该对象类型的所有实例。

还是我需要在每个MyObject中注册时将其添加到集合中,然后在删除它时注销它?

还是有更好的方法来处理这个问题吗?

2 个答案:

答案 0 :(得分:0)

您已经得到了答案:您需要注册一个函数来处理您在MyManager中创建的每个MyObject实例的MyObjectFinished_EventHandler:

private void CreateObjects()
{
    for (int i = 0; i < 100; i++)
    {
        MyObject o = new MyObject();
        o.OnFinished += OnMyObjectFinished;
        m_myObjectCollection.TryAdd(i.ToString(), o);
    }
}

处理程序看起来像这样:

private void OnMyObjectFinished(object source, EventArgs e)
{
    MyObject o = (MyObject)source;
    RemoveObject(o);
}

如您所见,您将源代码转换为MyObject引用,然后使用它来完成所需的操作。

编辑:我想澄清一件事:你通过订阅OnFinished事件来调用MyObject类中的清理函数;这是有效的,但更简单的是直接在DoStuff()中调用清理函数:

public delegate void MyObjectFinished_EventHandler(object source, EventArgs e);

    public event MyObjectFinished_EventHandler OnFinished;

    public MyObject()
    {
    }

    private void Finished()
    {
        //do some clean up stuff
    }

    public void DoStuff()
    {
        //do stuff until finished
        Finished();
        OnFinished(this, new EventArgs());
    }

事件通常用于向其他人(另一个对象)发出已发生事件的信号。

答案 1 :(得分:0)

  

当您注册对象的事件时,它是否向所有人注册   该对象的实例,还是特定于实例的?

是的,在您的情况下,您将事件连接到构造函数内的每个对象实例。因此,该事件将可用于所有实例。

为对象的每个实例创建一个新的Event / Delegate对象。

  

或者我需要在每个MyObject中注册,因为我将其添加到   收集,然后在删除时取消注册?

您已经通过将事件连接到新创建的对象实例来完成此操作。 您可以有一个方法从每个对象手动删除事件,或者您可以将它留给垃圾收集器为您完成工作。只要使用它的对象仍在内存中或不进行垃圾回收,事件对象就会存在