1

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

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

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

所以这是我正在看的东西:

 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 添加到集合时注册它,然后在删除它时取消注册?

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

4

2 回答 2

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

如您所见,您将 source 转换为 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());
    }

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

于 2013-05-07T03:01:27.900 回答
0

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

是的,在您的情况下,您将 Event 连接到 constructor.so 中的每个对象实例,该事件将可用于所有实例。

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

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

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

于 2013-05-07T03:07:20.190 回答