2010-09-24 28 views
0

产生处置IDisposable的项目我有一个Observable<WebResponse>WebResponse器具IDisposable由Observable

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

(忽略查询无意义!)

所以,我放弃WebResponse情况下不会对呼叫Dispose他们。这看起来很糟糕。

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

回答

2

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

var responseObservable = Observable.Using(() => CreateMyWebResponse(), Observable.Return); 
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#)。

+0

我已经编辑我的问题稍微更好地反映什么我实际上做。我真的很想知道是否有处理这类问题的模式。我看过Observable.Using,但我真的不明白。 – spender 2010-09-24 01:18:37