10

最近、Reactive Extensions for .NETに頭を悩ませようとしていますが、概念的な壁にぶつかりました。IObservable.First()がブロックされる理由がわかりません。

次のようなサンプルコードがあります。

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);

私が期待していたのは、itemA参照的に同等でaあり、そのメンバーなどにアクセスできるようにすることでした。代わりに、First()ブロックされ、Assert.AreEqual()到達することはありません。

Subscribe()これで、Rxを使用する場合、コードはsにすべきであることを十分に理解しているIObservableので、ここで間違ったことをした可能性があります。ただし、さまざまなメソッドシグネチャに基づいて、次のいずれかを実行することはできません。

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

また

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

私は何が欠けていますか?

4

2 に答える 2

9

テストプロジェクトでこのコードを試してみるとうまくいったので、問題のあるコードを再検討しました。IObservable<ListItem>問題は、がカバーの下のどこかで編集されPublish()ていたために、に変換されていたためであることが判明しましたIConnectableObservable<ListItem>。接続するための呼び出しがなければ、サブスクリプションは「アクティブ化」されませんでした。

于 2011-08-03T10:42:09.727 に答える
5

First()を返すのTではなく、Observable<T>を返すため、ブロックする必要があります。

非ブロッキングフォームはxs.Take(1)

于 2011-08-03T14:47:20.963 に答える