处理Observable生成的IDisposable项

时间:2010-09-24 01:06:22

标签: idisposable system.reactive

我有Observable<WebResponse>WebResponse实施IDisposable

responseObservable
    .Where(webResponse => webResponse.ContentType.StartsWith("text/html"))
    .Select(webResponse => webResponse.ContentLength)
    .Run()

(忽略查询的无意义!)

所以,我在没有调用WebResponse的情况下放弃了Dispose个实例。这看起来很糟糕。

更抽象地说:如果我有Observable<IDisposable>,我该如何处理生成的项目?

2 个答案:

答案 0 :(得分:2)

假设您有WebResponse CreateMyWebResponse()方法,请使用Observable.Using,如下所示:

var responseObservable = Observable.Using(() => CreateMyWebResponse(), Observable.Return);

答案 1 :(得分:1)

WhereDo位更改为

.Do(webResponse => {
    if (webResponse.ContentType.StartsWith("text/html")) 
        ProcessAndDispose(webResponse);
    else
        webResponse.Dispose(); })

也许?

修改

根据你的编辑,怎么样

.Select(webResponse => {
    int r = -1;
    if (webResponse.ContentType.StartsWith("text/html")) 
        r = webResponse.ContentLength;
    webResponse.Dispose(); 
    return r; })
.Where(i => i != -1)

现在?这将概括为类似

的内容
FilterProjectDispose(e, pred, proj) {
    e.Select(x => {
        using(x) {
            if (pred(x)) return Some(proj(x));
            else return None; }})
     .Where(x => x.IsSome)
     .Select(x => x.Value)
}
假设Some / None与F#一样(我显然开始忘记我的C#)。