2011-06-14 14 views
7

Tengo un código que escribe un archivo guardando un MemoryStream en un FileStream usando MemoryStream.WriteTo(). Después de que el archivo se cierra, se abre de nuevo para leer algunos datos ...¿FileStream.Dispose cierra el archivo inmediatamente?

Esto funciona aproximadamente 80 - 90% del tiempo. El otro 20% recibo una excepción que dice que el archivo está "en uso por otro proceso".

¿FileStream.Dispose() no libera recursos sincrónicamente? ¿Hay algo más bajo en Win32 land del que no estoy enterado? No veo nada obvio en la documentación de .Net.

+0

¿Esto está en NTFS? ¿Es el archivo local o en un recurso compartido remoto? Dudo que sea Dipose() que no cierre la MANIJA, creo que podría estar experimentando lo que los desarrolladores de SAMBA llamaron los "modos abiertos onerosos" de Windows (especialmente si un reintento de 500-1000ms en la segunda apertura tiene éxito). – ribram

+0

Es NTFS. Si sigo haciendo clic en el botón Guardar en mi ventana, finalmente se guarda. Estoy manejando errores así que al menos no falla. – Nate

Respuesta

5

Tan "inmediato" como sea posible. Fácilmente puede haber algún retraso debido a sobresaliente escribe , demora en la actualización de la información del directorio, etc. También podría ser un software antivirus que verifica su archivo modificado.

Este puede ser un caso raro en el que se requiere un Thread.Sleep(1). Pero para estar totalmente seguro, deberá detectar la (cualquier) excepción e intentar nuevamente una cantidad determinada de veces.

+0

Pensé en insertar un sueño. No es algo que me guste hacer, pero, eh, a veces esa es la mejor solución. Es posible que pueda sobrecargar algunos métodos y simplemente pasar una secuencia en lugar de una ruta de archivo. De esa forma no tengo que cerrar y luego abrir de nuevo ... Ah, y mi computadora portátil tiene BitLocker y antivirus. Ambos hacen que mi vida sea tan agradable. – Nate

+1

Sí, 'Sleep()' no se siente bien. especialmente cuando @ribram tiene razón con 500-1000ms de retrasos de retrie. Mantener el flujo abierto sería más rápido en todos los sentidos. ¿O obtener los datos del memoryStream? –

+1

Vi algo similar hoy y fue por el escáner de virus –

Cuestiones relacionadas