在管理器类型类中注册事件
本文关键字:注册 事件 管理器 类型 | 更新日期: 2023-09-27 18:12:19
我在这方面仍然是一个初学者,我正在努力更好地理解事件以及如何正确使用它们。
我有一个管理器类,它有一个容器来存储一堆对象;每个对象都有一个事件(本质上说它完成了它所做的事情)。我希望管理器类订阅事件,并在事件触发时从容器中删除对象。
当你注册一个对象的事件时,它是注册该对象的所有实例,还是特定于实例?
这就是我要看的内容:
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,因为我将它添加到集合中,然后在它被删除时取消注册?
或者有更好的方法来处理这个问题?
您已经有了答案:您需要注册一个函数来处理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());
}
事件通常用于通知其他人(另一个对象)发生了某事。
当你注册一个对象的事件时,它会注册所有的吗该对象的实例,还是特定于实例?
是的,在你的例子中,你将Event连接到构造函数中的每个对象实例。因此,该事件将对所有实例可用。
为对象的每个实例创建一个新的Event/Delegate对象。
或者我需要注册每个MyObject,因为我将它添加到集合,然后在它被删除时注销它?
您已经通过将事件连接到新创建的对象实例来完成此操作。您可以使用一个方法手动从每个对象中删除事件,也可以让垃圾收集器为您完成这项工作。只要使用事件对象的对象仍在内存中或未被垃圾收集,该事件对象就会存在。