关于c#:RX订阅后处理

Dispose after RX subscription

我有一个包含可观察的热点的类。它进行一些图像转换并收集指标(为简单起见,示例中为int)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Provider
{
  public IObservable<(int Metric, Bitmap Image)> HotObservable { get; }

  public Provider()
  {
    HotObservable = Observable.Interval(TimeSpan.FromSeconds(5))
      .Select(x => ...) // Some processing here
      .Where(x => ...) // Some conditions
      .Publish() // Make it hot
      .RefCount(); // Stay connected while there are subscription
  }

}

我想在没有其他可观察到的图像的情况下公开没有图像的指标:

1
public IObservable<int> MetricsObservable { get; } = HotObservable.Select(x => x.Metric);

问题

客户可以订阅其中任何一个,但随后应处置Bitmap

客户代码示例:

1
2
3
4
5
6
7
8
9
10
11
public void SubscribeClient()
{
  MetricsObservable.Subscribe(metric => AccumulateMetrics(metric));
  HotObservable(x =>
  {
    if (x.Image.Width < 1024)
      UploadImage(x.Image);

    // I could dispose image here in this case
  });
}

更糟糕的情况:

1
2
3
4
5
public void SubscribeClient()
{
  MetricsObservable.Subscribe(metric => AccumulateMetrics(metric));
  // No way to dispose bitmap because it's not here
}

问题:在RX中,是否有某种处理程序可以在完成所有订阅后触发?也许还有另一种方法可以实现类似的行为?


从本质上讲,Observable可以被任何客户端使用。在您的特定情况下,谁决定何时和由谁处置资源?最坏的情况是,一个客户端会在允许另一个实例使用该实例之前将其处置。在我看来,处置资源完全不是消费者的责任。无论订阅了哪个观察性,都是如此。

我认为,资源的始发者拥有它,并应注意在释放值后将其处置。