Rx处理订阅

Abh*_*tel 4 c# system.reactive

处理在循环中创建的订阅的推荐方法是什么?在下面的设计示例中,我将在for循环中生成订阅并将它们添加到a 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*lay 15

如果源完成,则不需要处理订阅.在您的示例中,如果您想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();
Run Code Online (Sandbox Code Playgroud)