如何避免多次注册事件

本文关键字:注册 事件 何避免 | 更新日期: 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);
        }
    }
}