处理循环中创建的订阅的推荐方法是什么?
在下面的示例中,我在 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());
}
}
如果源完成,则无需处置订阅。在您的示例中,如果您想停止枚举,您只需处置订阅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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)