我有一个返回IObservable 的方法
private IObservable<String> Name() {}
我想在调用等方法后获得一个常规字符串
string name = Name(). ???
我用什么代替???
string name = Name().Wait();
这将阻塞。但这并不完全符合Rx的精神。最好使用一个代理订阅它,当结果可用时,该代理将被调用:
Name().Subscribe(name => /* Do something with name */);
有几种方法可以做到这一点。
首先,正如詹姆斯所建议的,你可以只使用Wait
。然而,这有可能进入死锁,这取决于Name observable的实现和运行代码的环境。
string name = Name().Wait();
或者,您可以将其设置为订阅的副作用。这更好,但它引出了一个问题,"如果我需要同步它怎么办?">
string name = null;
Name().Subscribe(x => name = x);
如果您可以访问TPL,您也可以使用async
进行一些选择。
public async Task DoThing() {
string name = await Name(); // or await Name().FirstOrDefaultAsync();
};
因此,如果您需要同步到非反应式,您可以使用TPL和async
/await
。如果需要执行使用名称的副作用,可以使用Do
或Subscribe
,如果了解Wait
的工作原理,则可以在纯同步环境中检索名称。
为了理解哪一个最适合你,我想我们都需要看到更多的代码。基本上,你打算如何使用这个名字?这对于理解你应该如何使用可观察到的非常重要。
怎么样:
string name = await Name();
或者:
string name = Name.First();
如果你喜欢整个同步性的东西。