2010-09-24 63 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