简体   繁体   English

我需要取消订阅吗?

[英]Do I need to unsubscribe?

I have the following code: 我有以下代码:

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

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

And diagnostic processor gives me the following warning: 诊断处理器给我以下警告:

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

So I try to understand what is wrong here. 所以我试着理解这里有什么问题。 And try to find how to change the code. 并尝试找到如何更改代码。

Probably it solves the warning: 可能它解决了警告:

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

Also I have a question - do I really need to unsubscribe here ? 我也有一个问题 - 我真的需要在这里取消订阅吗? Because listener is just a local object. 因为监听器只是一个本地对象。

UPD: UPD:

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

Store the delegate in a variable so that it can be used to subscribe and unsubscribe in the lambda handler. 将委托存储在变量中,以便可以在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);
    //...
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我是否需要取消订阅表格中的活动? - Do I need to unsubscribe events in my Form? 我是否需要取消订阅 Xamarin.Forms 中的 GestureRecogniser? - Do I need to unsubscribe from a GestureRecogniser in Xamarin.Forms? 我是否需要取消订阅Click事件以防止内存泄漏? - Do I need to unsubscribe Click event to prevent memory leaks? 我需要为我的 BackgroundWorker 处理和取消订阅事件吗 - Do i need to dispose and unsubscribe from events for my BackgroundWorker 我是否需要取消订阅ac#Metro应用程序中的事件? - Do I need to unsubscribe from an event in a c# metro application? 使用 IDisposable 取消订阅事件——我是否需要在 dispose 中放入其他东西? - Using IDisposable to unsubscribe an event— do I need to put other things inside the dispose? 这两种订阅事件的方式之间的区别,我是否需要在第二种情况下取​​消订阅 - The difference between these two ways of subscription to an event and do I need to unsubscribe in the second case 在关闭wpf中的窗口时,我是否必须取消订阅事件? - do i have to unsubscribe from events when closing a window in wpf? 我什么时候退订自定义控件中的事件 - When do I unsubscribe from events inside Custom Control 在所有情况下,我是否必须取消订阅所有活动? - Do I HAVE TO unsubscribe from all events in all cases?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM