如何从 IObservable<string> 反应式扩展中获取字符串



我有一个返回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。如果需要执行使用名称的副作用,可以使用DoSubscribe,如果了解Wait的工作原理,则可以在纯同步环境中检索名称。

为了理解哪一个最适合你,我想我们都需要看到更多的代码。基本上,你打算如何使用这个名字?这对于理解你应该如何使用可观察到的非常重要。

怎么样:

string name = await Name();

或者:

string name = Name.First();

如果你喜欢整个同步性的东西。

相关内容

  • 没有找到相关文章

最新更新