可观察 - 在成功完成之前不会返回结果

时间:2017-11-01 22:12:47

标签: system.reactive

我有一个IObservable<T>来自解析CSV,为每一行吐出一个已解析的结果。

现在有一个问题是源数据中的损坏,直到我已经到达文件末尾才能检测到:使用当前的Reactive设置,这意味着我已经发出不好的结果。

在解决源数据问题之前,有没有办法可以&#34;缓冲&#34; (保留)整个IObservable结果流,以便在成功完成之前不会发出任何结果?没有方法签名应该更改(源应该仍然返回IObservable<T>)。

2 个答案:

答案 0 :(得分:2)

这很容易,只需这样做:

var query = source.ToArray();

IDisposable subscription =
    source.Subscribe(allRows =>
    {
        /* do something with `allRows` */
    });

.ToArray()运算符将IObservable<T>转换为返回零或更多值的IObservable<T[]>,返回一个包含零个或多个元素的T数组。

您必须确保源观察结束以OnCompleted结束才能生成数组。

您还可以使用.ToList()返回IList<T>而不是T[]

如果您想返回IObservable<T>而不是IObservable<T[]>,只需在.SelectMany(t => t)之后添加.ToArray()即可。请记住,这意味着一旦源可观察完成,所有值将立即出现。

答案 1 :(得分:-2)

我确定有更好的方法,但这应该有效:

// csvObservable is your existing observable
var waitTillEndObservable = csvObservable.ToList().Wait().ToObservable();

这将转换为一个列表,等待它完成,然后转换回一个observable,以便它可以与现有的csvObservable互换使用。