为什么IObservable <t> .First()阻止?</t>

时间:2011-08-03 09:05:23

标签: c# system.reactive reactive-programming

我一直试图深入了解.NET的Reactive Extensions,但是它已经触及了一些概念墙:我无法弄清楚为什么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()

现在,我知道在使用Rx时代码应该Subscribe()IObservable,所以我可能在这里做错了。但是,基于各种方法签名,不可能执行以下任一操作:

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

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

我错过了什么?

2 个答案:

答案 0 :(得分:9)

在测试项目中尝试使用此代码工作正常,因此我重新查看了有问题的代码。事实证明问题是因为IObservable<ListItem>Publish()编辑到了隐蔽的地方,因此被转换为IConnectableObservable<ListItem>。没有连接调用,订阅从未“激活”。

答案 1 :(得分:5)

First()会返回T,而不是Observable<T>,因此必须阻止。

非阻止表单为xs.Take(1)