我需要退订吗?

Do I need to unsubscribe?

我有以下代码:

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);
    //...
}

我还有一个问题 - 我真的需要在这里退订吗? 因为listener只是一个本地对象。

更新:

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

将委托存储在一个变量中,以便它可以用于在 lambda 处理程序中订阅和取消订阅。

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);
    //...
}