如果我ToEnumerable
在 an 上使用扩展名IObservable
,则用户有可能不会迭代所有元素。在那种情况下,如何正确处理IDisposable
声明的?Observable.Create
为了争论起见,我们说直接将其返回给用户不是一个选项IObservable
(在这种情况下,用户可以自己实现取消)。
private IObservable<Object> MakeObservable()
{
return Observable.Create(async (observer, cancelToken) =>
{
using(SomeDisposable somedisposable = new SomeDisposable())
{
while(true)
{
Object result = somedisposable.GetNextObject();
if(result == null)
{
break;
}
observer.OnNext(result);
}
}
}
}
public IEnumerable<Object> GetObjects()
{
return MakeObservable().ToEnumerable();
}
public void Test()
{
IEnumerable<Object> e = GetObjects();
int i = 0;
foreach(Object o in e)
{
if(i++ == 10)
break;
}
//somedisposable is not disposed here!!!
}