Je voudrais adapter un IEnumerable, IDisposable (source) dans un Observable et aimerait connaître la meilleure façon de faire cela et avoir la méthode source.Dispose s'appelle lors de la désinscription. Il y a un example sur introtorx.com d'adapter un IEnumerable, mais il indique explicitement qu'il a beaucoup de défauts tels que le modèle inadmissible de disposition, modèle pauvre de concurrence, aucune gestion des erreurs, etc ... et que la version intégrée gère ces. Mais la version intégrée ne semble pas appeler Dispose sur la source IEnumerable lors de la désinscription.C# Rx Comment disposer correctement de la source Enumerable dans créé Observable
Idéalement, je voudrais utiliser le modèle .Publish().RefCount()
pour avoir plusieurs abonnés sur la même source et avoir seulement la source Dispose()
appelée quand ils sont tous désabonnés.
Voici le code de ma tentative, bien que cela ne fonctionne pas.
static void FromEnumerableTest() {
var observable = Observable.Create<int>(
observer => {
var source = new JunkEnumerable();
foreach (int i in source) {
observer.OnNext(i);
}
return() => {
source.Dispose();
};
})
.SubscribeOn(Scheduler.Default)
.Do(i => Console.WriteLine("Publishing {0}", i)) // side effect to show it is running
.Publish()
.RefCount();
//var observable = Observable.ToObservable(new JunkEnumerable())
// .SubscribeOn(Scheduler.Default)
// .Do(i => Console.WriteLine("Publishing {0}", i)) // side effect to show it is running
// .Publish()
// .RefCount();
Console.WriteLine("Press any key to subscribe");
Console.ReadKey();
var subscription = observable.Subscribe(i => Console.WriteLine("subscription : {0}", i));
Console.WriteLine("Press any key to unsubscribe");
Console.ReadKey();
subscription.Dispose();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
class JunkEnumerable : IEnumerable<int>, IDisposable {
public void Dispose() { Console.WriteLine("JunkEnumerable.Dispose invoked"); }
public IEnumerator<int> GetEnumerator() { return new Enumerator(); }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
class Enumerator : IEnumerator<int> {
private int counter = 0;
public int Current {
get {
Thread.Sleep(1000);
return counter++;
}
}
object IEnumerator.Current { get { return Current; } }
public void Dispose() { Console.WriteLine("JunkEnumerable.Enumerator.Dispose invoked"); }
public bool MoveNext() { return true; }
public void Reset() { counter = 0; }
}
}
double possible de http://stackoverflow.com/questions/7322395/creating-a-weak-subscription-to-an -iobservable –