Ich mag ein IEnumerable, IDisposable (Quelle) in ein beobachtbares anzupassen und möchte den besten Weg, wissen, dies zu tun und haben die source.Dispose Methode aufgerufen nach dem Abbestellen.C# Rx Wie man richtig von Quelle entsorgen Enumerable in beobachtbare erstellt
Es gibt eine example auf introtorx.com der Anpassung eines IEnumerable, aber es gibt explizit an, dass es viele Mängel wie falsche Entsorgung Muster, schlechte Nebenläufigkeit Modell, keine Fehlerbehandlung, etc ... und dass die eingebaute Version hat handhabt diese. Aber die eingebaute Version scheint Dispose auf der Quelle IEnumerable nach Abbestellung nicht aufzurufen.
Idealerweise würde ich gerne das Muster .Publish().RefCount()
verwenden, um mehrere Abonnenten an derselben Quelle zu haben und nur die Quelle Dispose()
aufzurufen, wenn sie alle abgemeldet sind.
Hier sind ist der Code für meinen Versuch, wenn es nicht funktioniert.
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; }
}
}
möglich Duplikat http://stackoverflow.com/questions/7322395/creating-a-weak-subscription-to-an -iobservable –