Frage Warum blockiert IObservable .First ()?


Ich habe in letzter Zeit versucht, mich mit den Reactive Extensions für .NET zu beschäftigen, aber ich habe ein bisschen eine konzeptionelle Wand gefunden: Ich kann nicht herausfinden, warum IObservable.First () Blöcke.

Ich habe einen Beispielcode, der ungefähr so ​​aussieht:

var a = new ListItem(a);
var b = new ListItem(b);
var c = new ListItem(c);
var d = new ListItem(d);

var observableList = new List<ListItem> { a,b,c,d }.ToObservable();

var itemA = observableList.First();

// Never reached
Assert.AreEqual(expectedFoo, itemA.Foo);

Was ich erwartet hatte, war für itemA referentiell gleich sein a und auf seine Mitglieder usw. zugreifen zu können. Was stattdessen passiert, ist das First() Blöcke und die Assert.AreEqual() wird nie erreicht.

Jetzt weiß ich genug, um zu wissen, dass bei der Verwendung von Rx Code sollte Subscribe() zu IObservables, also ist es wahrscheinlich, dass ich hier nur das Falsche getan habe. Es ist jedoch nicht möglich, basierend auf den verschiedenen Methodensignaturen entweder:

observableList.First().Subscribe(item => Assert.AreEqual(expectedFoo, item));

oder

observableList.Subscribe(SomeMethod).First() // This doesn't even make sense, right?

Was vermisse ich?


10
2017-08-03 09:05


Ursprung


Antworten:


First() gibt a zurück T, nicht ein Observable<T>, also muss es blockieren.

Eine nicht blockierende Form ist xs.Take(1)


5
2017-08-03 14:47



Der Versuch, diesen Code in einem Testprojekt auszuprobieren, funktionierte gut, also habe ich den problematischen Code noch einmal gelesen. Es stellte sich heraus, das Problem war, weil die IObservable<ListItem> war sein Publish()irgendwo unter die Decke gebracht und so in ein IConnectableObservable<ListItem>. Ohne einen Verbindungsaufbau wurde das Abonnement nie "aktiviert".


9
2017-08-03 10:42