我是
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
。
要在不再使用订阅者时处理订阅者的取消订阅,您可以在 Receiver.cs 类(或 Blazor 组件)中使用 IDisposable 机制,以确保在组件或类被销毁时正确处置订阅。
在 MessageService 实现中,订阅作为 IDisposable 对象存储在 _disposables 列表中。这是一个好的开始,但您要求的是当不再需要 Receiver.cs 类时自动取消订阅。
以下是解决此问题的方法:
确保接收者正确处置其订阅:当 Receiver.cs 对象(或 Blazor 组件)被销毁时,订阅应自动处置,以便操作不会继续执行。
在 Receiver.cs 中使用 IDisposable 接口:Receiver.cs 类应该实现 IDisposable,以便在不再需要该对象时清理任何资源(例如订阅)。
让我们修改 Receiver.cs 类和订阅处理:
第一步:修改MessageService,更加灵活 你不需要在这里做太多改变。但 Dispose 方法正确清理资源很重要。