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

C# 在管理器类型类中注册事件,c#,events,C#,Events,我仍然是这方面的初学者,我正在努力更好地理解事件以及如何正确使用它们 我有一个manager类,它有一个容器来存储一堆对象;每个对象都有一个事件(本质上是说它完成了它所做的事情)。我希望manager类订阅事件,并在事件触发时从容器中删除对象 当您向对象的事件注册时,它是向该对象的所有实例注册,还是特定于实例 这就是我所看到的: class MyManager { private ConcurrentDictionary<string, MyObject> m_myObje

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

我有一个manager类,它有一个容器来存储一堆对象;每个对象都有一个事件(本质上是说它完成了它所做的事情)。我希望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());
    }
类MyManager
{
私有ConcurrentDictionary m_MyObject集合;
公共事务经理()
{
m_myObjectCollection=新的ConcurrentDictionary();
}
私有void移除对象(MyObject MyObject)
{
//从集合中删除对象
}
}
类MyObject
{      
公共委托void MyObjectFinished_EventHandler(对象源,EventArgs e);
公共事件MyObjectFinished\u EventHandler OnFinished;
公共对象()
{
this.OnFinished+=新的MyObjectFinished\u事件处理程序(MyObject\u OnFinished);
}
私有void MyObject_OnFinished(对象源,事件参数e)
{
//做些清理工作
}
私人无效文件()
{
//把事情做完
OnFinished(这是新的EventArgs());
}
让manager类创建MyObject的一个实例,然后注册该对象的事件就足够了吗?这对我来说似乎不对;我的直觉告诉我,我只会注册该对象的事件,而不是该对象类型的所有实例

或者,我需要在将每个MyObject添加到集合中时向其注册,然后在删除它时取消注册


或者有更好的方法来处理这个问题吗?

您已经有了答案:您需要注册一个函数来处理在MyManager中创建的每个MyObject实例的MyObject Finished\u EventHandler:

private void CreateObjects()
{
    for (int i = 0; i < 100; i++)
    {
        MyObject o = new MyObject();
        o.OnFinished += OnMyObjectFinished;
        m_myObjectCollection.TryAdd(i.ToString(), o);
    }
}
如您所见,您可以将源代码强制转换为MyObject引用,然后使用它来执行所需的操作

编辑:我想再澄清一件事:您通过订阅OnFinished事件来调用MyObject类中的cleanup函数;这是可行的,但更简单的方法是直接在DoStuff()中调用cleanup函数:

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

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

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

将为对象的每个实例创建一个新的事件/委托对象

还是在我将每个MyObject添加到 收集,然后在删除时注销

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

我怀疑是这样的;非常感谢您花时间为我澄清这一点!
private void OnMyObjectFinished(object source, EventArgs e)
{
    MyObject o = (MyObject)source;
    RemoveObject(o);
}
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());
    }