c# - ¿Es necesario eliminar IFormFile.OpenReadStream()?

CorePress2024-01-16  6

¿Se debe llamar a IFormFile.OpenReadStream() dentro de un bloque de uso para que se elimine correctamente? ¿O IFormFile lo eliminará después de que la solicitud http termine de procesarse?

https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.iformfile.openreadstream?view=aspnetcore-5.0#Microsoft_AspNetCore_Http_IFormFile_OpenReadStream

He estado usando objetos IFormFile durante años y siempre envuelvo la secuencia en un bloque de uso. Es una buena práctica deshacerse siempre de las transmisiones que cree. Cuál es tu preocupaciónsobre eso? ¿Que podrían deshacerse de él dos veces?

-Andy

19/03/2021 a las 20:19

@Andy, la cuestión es que tú no estás creando la transmisión, .net core creó la transmisión.

- Lucas

5 de marzo de 2022 a las 23:40

@Luke: la transmisión no se crea hasta que llamas a OpenReadTransmitir. Mira la fuente. Deshacerse de él es inofensivo, devuelve un nuevo ReferenceReadStream, lo que resulta en una operación no operativa. Es una buena práctica deshacerse de todas las transmisiones que abra....

-Andy

6 de marzo de 2022 a las 6:16

Esa línea a la que has señalado no crea la secuencia, sino que crea un objeto que contiene la secuencia que ya existe. Estoy de acuerdo en que llamar a disponer de ese objeto no hace nada. Entonces, lo que estás describiendo no es llamar a Cerrar en ninguna transmisión.

- Lucas

6 de marzo de 2022 a las 21:46

1

En una secuencia, Dispose llama a Close(), que es el único método que contiene lógica de limpieza. Pero eso no viene al caso, ReferenceStream no es responsable de crear o eliminar la secuencia IFormFile. Ése es el punto al que me refiero. Ya existe y no lo eliminamos llamando a disponer.

- Lucas

15 de marzo de 2022 a las 18:14



------------------------------------

La implementación predeterminada de FormFile crea un nuevo ReferenceReadStream cada vez que se llama a OpenReadStream(): https://github.com/dotnet/aspnetcore/blob/033b1fb1cf681ea95d3954c08e4391c93cd72683/src/Http/Http/src/FormFile.cs#L81

ReferenceReadStream no contiene ningún recurso no administrado. Llamar a Dispose es esencialmente una operación no operativa. https://github.com/dotnet/aspnetcore/blob/033b1fb1cf681ea95d3954c08e4391c93cd72683/src/Http/Http/src/Internal/ReferenceReadStream.cs#L14

Teniendo esto en cuenta, no es necesario eliminar IFormFile.OpenReadStream(). Pero desecharlo tampoco hace daño.

1

4

Me gusta esta respuesta, pero como dijiste, "desechar no daña nada". así que recomiendo desecharlo. No se produce ningún daño y si la implementación se cambia en una actualización para utilizar recursos no administrados, entonces ya estará cubierto y no habrá feas pérdidas de memoria que lo apoyen

- Perbert

21/01/2022 a las 13:35



------------------------------------

OpenReadStream() no crea una nueva "secuencia"; sin embargo, crea un nuevo ReferencedReadStream(), donde se reutiliza la secuencia base. Usaría FlushAsync ya que Flush() no tiene implementación y luego cerraría la transmisión de todos modos.

return new ReferenceReadStream(_baseStream, _baseStreamOffset, Length);

https://github.com/dotnet/aspnetcore/blob/033b1fb1cf681ea95d3954c08e4391c93cd72683/src/Http/Http/src/FormFile.cs#L81

Respondido

10 de febrero de 2023 a las 18:32

Denise Lofland

Denise Lofland

11

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare