У меня есть поток, который поступает из метода 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. Есть мысли по этому поводу?