2011-06-01 9 views
5

Al acceder a un recurso usando Application.GetResourceStream se devuelve una instancia de la clase StreamResourceInfo, esta clase no implementa IDisposable.Liberación del flujo subyacente devuelto por Application.GetResourceStream en WP7

¿Debo cerrar \ disponer el flujo subyacente expuesto por StreamResourceInfo cuando he terminado de procesar la corriente en un dispositivo WP7 - No quiero saber sobre Using o el patrón Dispose.

Un ejemplo sería utilizar el método para acceder a un archivo ZIP que está contenida en el paquete de ZAP y una vez que haya descomprimido el archivo no necesito la instancia Stream más.

Respuesta

3

El ejemplo de código proporcionado here no hace uso de using, Close() o Dispose().

Desde la documentación de StreamResourceInfo no menciona Close() o Dispose() (y StreamResourceInfo en realidad no heredan de Stream o cualquier otra cosa que pudiera poner en práctica estos métodos), creo que es seguro dejar que el objeto salga del alcance y de la basura recoger de forma natural.

sospecho que la clase StreamResourceInfo tiene un finalizador que llama Dispose() en el Stream objeto fundamental durante la recolección de basura, pero no tengo una copia del reflector disponible para mí en este momento para verificar que. El patrón IDisposable es bastante robusto en ese sentido.

Sin embargo, si aún se siente incómodo con ese nivel de incertidumbre, siempre puede llamar al Close() en el objeto Stream.

0

No sé acerca de Windows 7 de teléfono específicamente, pero la práctica habitual es disponer el objeto y que se cierra automáticamente la corriente si se abre. La eliminación debe ser la operación final de un objeto, mientras que el cierre indica la posibilidad de reapertura. Entonces deberías ir a disponer en mi opinión.

+0

agradecimiento que comprenden el patrón de disponer, el problema es el StreamResourceInfo no tiene un método dispose es uno mismo, pero la corriente contenida hace. – AwkwardCoder

+0

Entonces no tienes más opción que llamar cerca. El flujo debería idealmente implementarse de tal manera que debería llamar a deshacerse del flujo subyacente una vez que se cierre en este caso. ¿puedes acceder a la transmisión subyacente de todos modos? –

0

Using llama automáticamente al método de eliminación una vez que se alcanza el final del alcance using. Entonces, podrías hacer algo como esto. Una vez que se llegue al final del alcance, se eliminará su flujo.

using (var stream = Application.GetResourceStream(new Uri("myResource.zip", UriKind.Relative)).Stream) 
{ 
     //stream code 
} 

Edición - Mover las respuestas de los comentarios que aquí: El StreamResourceInfo no es responsable por el cierre/eliminación de la corriente. A menos que transfiera ese flujo a otra cosa (por ejemplo, un StreamReader), es su trabajo cerrar la transmisión. Found a link that may be of interest, que prácticamente concuerda con eso.

+0

¿Ha leído mis comentarios sobre la otra respuesta ... – AwkwardCoder

+0

@AwkwardCoder - lo vi, pero no veo cuál es el problema. 'StreamResourceInfo' no es responsable de la transmisión, usted lo es. Por lo tanto, usted tiene la responsabilidad de cerrar/eliminar la transmisión. '' Usar', o llamar manualmente a 'Dispose' en la transmisión es la manera de hacerlo. ¿Qué estás intentando lograr? – keyboardP

+0

"Usar automáticamente llamadas al método de eliminación una vez que se llega al final del alcance de uso." - alguna vez pensé que podría saber esto ...Estoy preguntando sobre una clase específica en el retorno del marco mediante una llamada a Application.GetResourceStream. – AwkwardCoder

Cuestiones relacionadas