2010-07-15 13 views
7

ejecutamos varias instancias de nuestro programa (C#) en una sola computadora. En cada instancia, nuestro código intenta crear "muchos" archivos temporales con ayuda del método Path.GetTempFile(). Y a veces, nuestro programa falla con una excepción:Path.GetTempFileName en MultiProcessing

Exception: Access to the path is denied. 
StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.Path.GetTempFileName() 

he comprobado carpeta temporal y no encontrar algo extraño: libre en disco es suficiente, el número de archivos temporales no es muy grande, etc.

I solo tiene una explicación: una instancia obtiene el archivo temporal y lo abre, pero al mismo tiempo, otra instancia también obtiene el nombre del archivo temporal e intenta abrirlo. Si es correcto? En caso afirmativo, ¿cómo resolver el problema, sino cómo entender qué problema?

UPD: fallaron en el ordenador con Windows Server 2008 HPC

Gracias, Igor.

+0

No es probable, creo. Si el método 'GetTempFileName' no fuera seguro para subprocesos o no generara un nombre bien aleatorio, no estaría allí. No es que yo sepa cuál es la causa exacta ... – Noldorin

+0

Para eliminar lo que crees que podría ser la causa, simplemente haz un * if (Directory.Exists (myTempFolderName)) * antes de crear la carpeta temporal - si existe, genera un nuevo nombre. – slugster

+0

¿Quiere decir que no es una buena práctica usar Path.GetTempFileName()? Si el método no es "multi thread o process save" ¿cómo podemos usarlo? cuando necesito una carpeta temporal con una extensión especial, utilizo Guid para generar un nombre de archivo único. – constructor

Respuesta

4

msdn estados de la clase Path:

estáticos públicos (Shared en Visual Basic) de este tipo son seguros para subprocesos.

Furthermore hay dos razones dadas para excepciones IO:

  1. El método GetTempFileName elevará una IOException si se utiliza para crear más de 65.535 archivos sin borrar los archivos temporales anteriores.

  2. El método GetTempFileName generará una excepción IOException si no hay ningún nombre de archivo temporal único disponible. Para resolver este error, elimine todos los archivos temporales innecesarios.

que recomiendo para comprobar estas condiciones (ya que ustedes afirman explícitamente que se crea muchos archivos temporales).

+0

Revisé la carpeta temporal de Windows. No encontré más de 1000 archivos en la carpeta."Muchos" en nuestro caso significa quizás 200-300 archivos temporales (totalmente) cuando todas las instancias comienzan a funcionar. Según tengo entendido, "thread safe" no es equivalente a "guardar múltiples procesos". tenemos varias instancias (procesos, no hilos). – constructor

Cuestiones relacionadas