处理循环中创建的订阅的推荐方法是什么?
在下面的设计示例中,我将在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());
}
}
答案 0 :(得分:14)
如果源完成,则不需要处理订阅。在您的示例中,如果您希望在完成之前停止枚举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();