Нужно ли отписываться? - PullRequest
       27

Нужно ли отписываться?

0 голосов
/ 01 октября 2018

У меня есть следующий код:

public void UnPublishDatabases(IReadOnlyCollection<IPublishedDatabase> sqlDatabases)
{
    var listener = new UnpublishDatabaseListener();
    listener.DatabaseUnpublished += db =>
    {
        OnDatabaseUnpublished(db); 
        listener.DatabaseUnpublished -= OnDatabaseUnpublished;
    };

    _publishController.Unpublish(sqlDatabases, listener);
    //...
}

И диагностический процессор выдает мне следующее предупреждение:

Event 'listener.DatabaseUnpublished' should not be subscribed with the same 'listener.DatabaseUnpublished' object.

Поэтому я пытаюсь понять, что здесь не так.И попробуйте найти, как изменить код.

Вероятно, это решает предупреждение:

public void UnPublishDatabases(IReadOnlyCollection<IPublishedDatabase> sqlDatabases)
{
    var listener = new UnpublishDatabaseListener();
    //save ref
    var listenerCopy = listener;
    listener.DatabaseUnpublished += db =>
    {
        OnDatabaseUnpublished(db); 
        //use it
        listenerCopy.DatabaseUnpublished -= OnDatabaseUnpublished;
    };

    _publishController.Unpublish(sqlDatabases, listener);
    //...
}

Также у меня есть вопрос - мне действительно нужно отписаться здесь?Потому что слушатель - это просто локальный объект.

UPD:

public class UnpublishDatabaseListener
{
    public event Action<IPublishedDatabase> DatabaseUnpublished;
    //...
}

1 Ответ

0 голосов
/ 01 октября 2018

Сохраните делегата в переменной, чтобы его можно было использовать для подписки и отмены подписки в лямбда-обработчике.

public void UnPublishDatabases(IReadOnlyCollection<IPublishedDatabase> sqlDatabases) {
    var listener = new UnpublishDatabaseListener();
    Action<IPublishedDatabase> handler = delegate { };
    handler = db => {
        OnDatabaseUnpublished(db); 
        //unsubscribe
        listner.DatabaseUnpublished -= handler;
    };
    //subscribe
    listener.DatabaseUnpublished += handler;

    _publishController.Unpublish(sqlDatabases, listener);
    //...
}
...