如何用可能需要重新运行的任务组成一个observable?

时间:2016-12-17 16:42:10

标签: c# rx.net

假设我有一个运行查询的异步方法 并返回一组结果:

Task<IEnumerable<Foo>> FetchResultSet();

我有一个可观察到的东西,无论什么时候发射 结果集需要再次获取:

IObservable<Unit> NeedToRefetch;

我想要的是:

IObservable<IEnumerable<Foo>>

哪个(1)运行查询并产生一个初始值 结果集,(2)每次NeedToRefetch触发,运行 再次查询并产生另一个结果集。

构成这种观察结果的最佳方法是什么?

如果我不需要初始结果集,我可以这样做:

NeedToRefetch
    .Select(_ => Observable.FromAsync(() => FetchResultSet()))
    .Concat();

因此,为了确保查询至少运行一次,我可以 这样做:

Observable.Return(Unit.Default)
    .Merge(NeedToRefetch)
    .Select(_ => Observable.FromAsync(() => FetchResultSet()))
    .Concat();

但后来我开始阅读冷热观察和我 我想知道我是否应该这样做:

var initial = Observable.FromAsync(() => FetchResultSet());
var later = NeedToRefetch
    .Select(_ => Observable.FromAsync(() => FetchResultSet()))
    .Concat();
initial
    .Merge(later);

然后我想知道这是否是我应该使用的情况 Observable.Create

然后我就不再想知道并写下这个问题了。

1 个答案:

答案 0 :(得分:1)

我会说你几乎就在那里。您可以使用原始方法。要立即运行一次,您可以添加StartWith()

NeedToRefetch
    .StartWith(Unit.Default)
    .Select(_ => Observable.FromAsync(() => FetchResultSet()))
    .Concat();