代码之家  ›  专栏  ›  技术社区  ›  isxaker

我需要退订吗?

  •  1
  • isxaker  · 技术社区  · 6 年前

    我有以下代码:

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

    因为侦听器只是一个本地对象。

    public class UnpublishDatabaseListener
    {
        public event Action<IPublishedDatabase> DatabaseUnpublished;
        //...
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Nkosi    6 年前

    将委托存储在变量中,以便在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);
        //...
    }