0
IObservable
でToEnumerable
拡張子を使用すると、ユーザーはすべての要素を反復しない可能性があります。その場合Observable.Create
でIDisposable
はどのように処理されるのが適切ですか?Reactive Extensions ToEnumerableすべてを反復しない場合に観測可能状態を破棄する方法
引数として、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!!!
}
ありがとうございました。私は 'Interval'を使用しませんが、なぜこのことが起こっているのか理解できました。私は、foreachを終了するとキャンセルされるように見える 'cancelToken'をより多く使うことができることに気付きました。 –