Утилизация идентифицируемых объектов, сгенерированных Observable - PullRequest
1 голос
/ 24 сентября 2010

У меня есть Observable<WebResponse> (WebResponse орудия IDisposable)

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

(Игнорировать бессмысленность запроса!)

Итак, я отбрасываю WebResponse экземпляров без вызова Dispose для них. Это кажется плохим.

Более абстрактно: если у меня есть Observable<IDisposable>, как мне справиться с утилизацией сгенерированных предметов?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2010

Предполагая, что у вас есть метод WebResponse CreateMyWebResponse(), используйте Observable.Using, например:

var responseObservable = Observable.Using(() => CreateMyWebResponse(), Observable.Return);
1 голос
/ 24 сентября 2010

Измените биты Where и Do на что-то вроде

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

возможно

EDIT

На основании ваших правок, как насчет

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

...