Как избежать многократной регистрации событий

1

У меня есть событие, в котором я регистрирую обработчики событий.

event Action OnGameList;

то, например, я получаю такой код:

backend.OnGameList += ProcessGameList;
backend.GetGameList(); //this will trigger the above event.

каждый раз, когда я достигаю этого кода, обработчик добавляется. это означает, что во второй раз он будет называться дважды. конечно, я мог бы удалить его в такой функции:

backend.OnGameList -= ProcessGameList;

но я чувствую, что есть лучшее решение для такого рода проблем.

  • 1
    Без кода трудно сказать. Очевидный ответ - добавить событие только один раз в код, который вы не вызываете повторно, но сложно дать более конкретный совет, не понимая, почему вы добавляете его уже несколько раз.
  • 0
    Вы можете безопасно удалить сначала, а затем добавить снова. В противном случае вам придется проверить, если он уже зарегистрирован.
Показать ещё 2 комментария
Теги:

2 ответа

3

Вы можете проверить наличие определенного делегата в списке вызовов:

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);
        }
    }
}
  • 0
    это кажется хорошим решением, однако в моем конкретном случае я не могу его реально использовать, так как мои события - это те автоматически сгенерированные классы из ссылки службы WCF.
3

Я думаю, вы должны использовать какое-то фоновое поле для отслеживания того, что вы уже подписаны. Т.е.

    private bool _subscribed = false;

    SubscribeToOnGameListEvent();
    backend.GetGameList();

    private void SubscribeToOnGameListEvent()
    {
        if (!_subscribed)
        {
            backend.OnGameList += ProcessGameList;
            _subscribed = true;
        }
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню