如何避免多次注册事件
本文关键字:注册 事件 何避免 | 更新日期: 2023-09-27 18:25:53
我有一个事件,我在其中注册事件处理程序。
event Action OnGameList;
然后举个例子,我得到了这样的代码:
backend.OnGameList += ProcessGameList;
backend.GetGameList(); //this will trigger the above event.
每次我到达这个代码时,都会添加处理程序。这意味着第二次它将被调用两次。当然,我可以在这样的函数中删除它:
backend.OnGameList -= ProcessGameList;
但我觉得这类问题有更好的解决办法。
我认为您应该使用某种后备字段来跟踪您已经订阅的内容。即
private bool _subscribed = false;
SubscribeToOnGameListEvent();
backend.GetGameList();
private void SubscribeToOnGameListEvent()
{
if (!_subscribed)
{
backend.OnGameList += ProcessGameList;
_subscribed = true;
}
}
您可以检查调用列表中是否存在特定委托:
class Foo
{
private EventHandler bar;
public event EventHandler Bar
{
add
{
if (bar == null)
{
bar = value;
}
else
{
if (!bar.GetInvocationList().Contains(value))
{
bar += value;
}
}
}
remove
{
// ...
}
}
public void RaiseBar()
{
if (bar != null)
{
bar(this, EventArgs.Empty);
}
}
}