c# - 如何使用响应式(Reactive)扩展将同步轮询数据库查询转换为异步推送?

标签 c# system.reactive

目前,我在 NHibernate 中发出一个数据库选择,它返回结果的 IList。然后,我在返回的列表上使用 IList.ToObservable 来获取我可以订阅的 IObservable。我怎样才能在响应式(Reactive)范例中编写它,而不是仅仅将列表转换为 IObservable ?

最佳答案

使用响应式扩展进行数据库调用的最佳方法就是根本不这样做。

撇开简洁的俏皮话不谈,这是一个严肃的观点。线索就在问题中...您正在进行 IO 绑定(bind)调用,因此您确实处于异步拉取情况。

C# 8 中将对此提供一流的语言支持(IAsyncEnumerable - which already has placeholders in the Rx github repo)。

但是,当您发起了一个希望得到及时响应的调用时,您确实不想将同步调用响应公开为 Observable。可观察对象适用于当您不知道数据是否或何时出现时的推送场景。您可以使查询异步,并在结果出现时以更传统的方式处理结果。

您经常在 Rx 中看到异步数据库查询,它是可观察链的一部分,该可观察链 Root 于某些合适的可观察事件,例如 UI 中的按键。按键事件被输入到一个 Observable 中,该 Observable 又转换到一个异步查询中,并弹出回 UI 中。例如:The example here有一个服务调用可以很容易地成为异步数据库查询。关键部分是 getSuggestions 异步校准的使用以及如何将其连接到可观察查询。

请注意,即使在这种情况下,服务调用本身仍然是异步拉取,不会直接返回 Observable;它是由其他一些观察到的事件启动的。

关于c# - 如何使用响应式(Reactive)扩展将同步轮询数据库查询转换为异步推送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46069663/

相关文章:

c# - 从 Microsoft Health API 检索数据

c# - 如何从 C# 中的嵌入式文件流中解压缩

.net - Rx 订阅和垃圾收集

c# - 响应式扩展 BufferWithPredicate

c# - 使用 SharpSVN 如何将文件导出到内存而不是文件系统?

c# - Visual Studio 2015 企业版和混合版?

c# - 在数据库中存储关键字的最佳方法是什么,与语言无关

c# - 当其他可观察值为 true 时,从可观察值中获取项目

c# - 如何忽略来自可观察序列的所有通知(错误除外)?

.net - 响应式(Reactive)扩展 (Rx) 和异步类