Rx Утилизация подписки - PullRequest
4 голосов
/ 19 мая 2011

Каков рекомендуемый способ удаления подписок, созданных в цикле?В следующем надуманном примере я создаю подписки в цикле for и добавляю их в List и располагаю их простотой для каждого из них по List Это кажется мне немного вонючим, и я думаю, чтобыть более чистым способом очистки подписок, если только GC не удалит их при запуске.Нужно ли для простоты распоряжаться подписками?

class Program
{
    static void Main(string[] args)
    {
        Func<int, IEnumerable<int>> func = x =>
        {
            return Enumerable.Range(0, x);
        };

        List<IDisposable> subsriptions = new List<IDisposable>();
        for (int i = 1; i < 10; i++)
        {
            var observable = func(i).ToObservable().ToList();
            var subscription = observable.Subscribe(x => Console.WriteLine(x.Select(y => y.ToString()).Aggregate((s1, s2) => s1 + "," + s2)));
            subsriptions.Add(subscription);
        }
        Console.ReadLine();
        subsriptions.ForEach(s => s.Dispose());
    }
}

1 Ответ

14 голосов
/ 19 мая 2011

Подписки не нужно утилизировать, если источник завершен. В вашем примере вы могли бы распоряжаться подпиской только в том случае, если хотите прекратить перечисление Range до ее завершения.

Даже в этой ситуации чаще распределяют подписки с помощью оператора, который завершает подписку как часть ее дизайна, например Take, TakeWhile, TakeUntil.

Если вы хотите объединить несколько IDisposable подписок, CompositeDisposable предназначен именно для этого:

CompositeDisposable subsriptions = new CompositeDisposable();

subscriptions.Add(Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe());
subscriptions.Add(Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe());
subscriptions.Add(Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe());

subscriptions.Dispose();
...