Скопируйте поток ответов http в поток памяти, не копируя все данные в память - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть поток, который поступает из метода ReadAsStreamSync () из объекта HttpContent. Я возвращаю этот поток из метода, чтобы вызывающий его метод мог читать напрямую из http-потока без необходимости буферизации всего ответа в памяти.

Проблема, с которой я столкнулся сейчас, заключается в том, что мне нужно знать, когда поток, который я возвращаю, удаляется. Поскольку в потоке нет события «disposed», я думаю, что могу обернуть поток в класс, который наследует поток памяти, и переопределить метод dispose. Однако я не хочу копировать ПОЛНЫЙ ответный поток в поток памяти, потому что это будет означать, что весь контент будет записан в память. Я думаю, что это возможно, но я не могу найти информацию об этом.

Кто-нибудь может мне помочь с этим? Или предоставьте мне альтернативный метод, позволяющий определить, когда поток удаляется.

Edit:

После прочтения комментариев кажется, что я не очень ясно понял. Позвольте привести конкретный пример:

public class StreamGetter()
{
    public Stream GetSomeStream()
    {
        //some code here that gets the stream

        //and return the stream, this stream might be 100mb long, 
        //and since this method doesn't know what to do with it, 
        //we return the stream so the calling method can figure it out
        return generatedStream;
    }
}

public void SomeOtherMethod()
{
    using(var stream = GetSomeStream())
    {
        //some some stuff
    }
}

Теперь дело в том, что извлекаемый поток является потоком, полученным из ReadAsStreamAsync () содержимого httpResponseMessage, извлекаемого с использованием HttpClient. Теперь мне нужно избавиться от HttpClient, как только поток будет удален. Если я избавлюсь от этого раньше, я больше не смогу читать из потока. Если я не распоряжусь им, ресурсы никогда не освободятся.

Теперь, прежде чем кто-либо начнет упоминать, я не должен избавляться от HttpClient, потому что он сделан для повторного использования. Я знаю об этом, и я не использую HttpClient повторно, а использую HttpClientHandler.

Если вы считаете, что мой дизайн плохой, я также открыт для предложений о том, как написать код по-другому. Единственное требование - хранить весь код, связанный с HttpClient, в классе «StreamGetter», а также всю обработку потока результатов вне класса «StreamGetter».

edit2: Я думаю, что нашел решение, изменив класс. Заставив класс StreamGetter реализовать idisposable, я могу переместить ответственность за удаление содержимого за пределы класса StreamGetter. Вызывающий класс теперь может создать блок using, вызвать метод «GetSomeStream» и обработать результаты в пределах блока using. Затем метод dispose StreamGetter удаляет HttpClient. Есть мысли по этому поводу?

1 Ответ

0 голосов
/ 04 ноября 2018

В конце концов, я пошел делать весь класс одноразовым, и, делая это, перекладывая ответственность за удаление материала вне класса на метод вызова. Это избавило от необходимости знать, когда поток утилизируется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...