代码之家  ›  专栏  ›  技术社区  ›  spender

处理由Observable生成的IDisposable项

  •  1
  • spender  · 技术社区  · 14 年前

    我有一个 Observable<WebResponse> ( WebResponse 工具 IDisposable )

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

    (忽略查询的无意义!)

    所以,我放弃了 网络响应 不调用的实例 Dispose 在他们身上。这似乎很糟糕。

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   PL.    14 年前

    假设你有一个方法 WebResponse CreateMyWebResponse() 使用 Observable.Using 这样地:

    var responseObservable = Observable.Using(() => CreateMyWebResponse(), Observable.Return);
    
        2
  •  1
  •   Brian    14 年前

    改变 Where Do 有点像

    .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)。

    推荐文章