2010-09-24 14 views
0

Je dispose d'un Observable<WebResponse> (WebResponse met en œuvre IDisposable)articles IDisposable générés Mise au rebut par Observable

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

(Ignore la futilité de la requête!)

, je suis WebResponse cas sans en rejetant l'appel Dispose sur leur. Cela semble mauvais.

Plus abstraitement: Si j'ai un Observable<IDisposable>, comment gérer l'élimination des éléments générés?

Répondre

2

En supposant que vous avez une méthode WebResponse CreateMyWebResponse() utilisation Observable.Using comme ceci:

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

Modifier les Where et Do bits à quelque chose comme

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

peut-être?

EDIT

En fonction de votre édition, que diriez-vous

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

maintenant? Cela généraliser en quelque chose comme

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) 
} 

en supposant Some/None comme dans F # (je commence apparemment à oublier mon C#).

+0

J'ai légèrement modifié ma question pour mieux refléter ce que je suis en train de faire. Je me demande vraiment s'il y a une tendance à traiter ce genre de problème. J'ai regardé Observable.Using, mais je ne comprends pas vraiment. – spender