Утилизировать после подписки RX - PullRequest
1 голос
/ 28 мая 2020

У меня есть класс, содержащий горячие наблюдаемые. Он выполняет некоторые преобразования изображений и собирает метрики (int в примере для простоты)

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
  }

}

Я хочу предоставить метрики без изображений в другом наблюдаемом, например:

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

Проблема

Клиенты могут подписаться на любой из них, но Bitmap следует удалить позже.

Пример кода клиента:

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

Хуже того :

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

Вопрос: Возможно ли в RX иметь какой-то обработчик, который срабатывает после завершения всех подписок? Или, может быть, есть другой способ добиться подобного поведения?

1 Ответ

0 голосов
/ 04 июня 2020

По самой своей природе, Observable s могут быть использованы любым клиентом. В вашем конкретном случае, кто решает, когда и кем следует распорядиться ресурсом? В худшем случае один клиент избавится от экземпляра до того, как другому будет разрешено его использовать. Мне кажется, что потребитель вообще не обязан распоряжаться ресурсом. Это верно независимо от того, на какой наблюдаемый объект подписан.

...