如何取消订阅System.Reactive的Subject

问题描述 投票:0回答:1

我是

System.Reactive
的新手,对
Subject
以及如何使用它有些困惑。

我在这里有一个主题的基本实现:

public class MessageService : IMessageService
{
    private readonly Subject<KeyValuePair<int, int>> _paginationSubject = new();
    private readonly List<IDisposable> _disposables = new();

    public void Dispose()
    {
        _paginationSubject?.Dispose();
        foreach (var eachDisposable in _disposables)
        {
            eachDisposable?.Dispose();
        }
    }

    public void EmitPaginationChanges(KeyValuePair<int, int> pageAndSize)
    {
        _paginationSubject.OnNext(pageAndSize);
    }
     
    public void OnPaginationChanged(Action<KeyValuePair<int, int>> action)
    {
        _disposables.Add(_paginationSubject.Subscribe(action));
    }
}

某些类

MessageCreator.cs
(或 blazor 页面)正在创建一条消息并通过
EmitPaginationChanges
方法发出它。

现在,通过传递

Receiver.cs
OnPaginationChanged
方法订阅了
Action
类或 blazoe 页面。现在他们可以互相交流了。

我想做的是,一旦

Receiver.cs
对象不再使用(被销毁),我想取消订阅
Subject
。这样
Action
之后就不会执行,一旦创建了
Receiver.cs
的新对象,它就可以再次订阅
Subject

c# reactive-programming system.reactive
1个回答
-1
投票

要在不再使用订阅者时处理订阅者的取消订阅,您可以在 Receiver.cs 类(或 Blazor 组件)中使用 IDisposable 机制,以确保在组件或类被销毁时正确处置订阅。

在 MessageService 实现中,订阅作为 IDisposable 对象存储在 _disposables 列表中。这是一个好的开始,但您要求的是当不再需要 Receiver.cs 类时自动取消订阅。

以下是解决此问题的方法:

确保接收者正确处置其订阅:当 Receiver.cs 对象(或 Blazor 组件)被销毁时,订阅应自动处置,以便操作不会继续执行。

在 Receiver.cs 中使用 IDisposable 接口:Receiver.cs 类应该实现 IDisposable,以便在不再需要该对象时清理任何资源(例如订阅)。

让我们修改 Receiver.cs 类和订阅处理:

第一步:修改MessageService,更加灵活 你不需要在这里做太多改变。但 Dispose 方法正确清理资源很重要。

© www.soinside.com 2019 - 2024. All rights reserved.