2010-07-15 9 views
7

eseguiamo diverse istanze del nostro programma (C#) su un singolo computer. In ogni istanza il nostro codice tenta di creare "molti" file temporanei con l'aiuto del metodo Path.GetTempFile(). E a volte, il nostro programma non riesce con un'eccezione:Path.GetTempFileName in MultiProcessing

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

ho controllato cartella temporanea e non ha trovato qualcosa di strano: libero su disco è sufficiente, il numero di file temporanei non è molto grande, ecc

I avere una sola spiegazione: un'istanza ottiene il file temporaneo e lo apre, ma nello stesso tempo un'altra istanza ottiene anche il nome del file temporaneo e prova ad aprirlo. Se è corretto? Se sì, come risolvere il problema, se non come capire cos'è un problema?

UPD: fallito sul computer con Windows Server 2008 HPC

Grazie, Igor.

+0

Non credo che penso. Se il metodo 'GetTempFileName' non fosse thread-safe o non generasse un nome ben randomizzato, non sarebbe lì. Non che io sappia quale sia la causa esatta ... – Noldorin

+0

Per eliminare quello che pensi possa essere la causa, fai un * if (Directory.Exists (myTempFolderName)) * prima di creare la cartella temporanea - se esiste allora genera un nuovo nome. – slugster

+0

Vuoi dire, non è una buona pratica usare Path.GetTempFileName()? Se il metodo non "multi-thread o processo salva" come possiamo usarlo? quando ho bisogno di una cartella temporanea con un'estensione speciale, utilizzo Guid per generare un nome file univoco. – constructor

risposta

4

msdn stati per la classe Path:

statici pubblici (in Visual Basic) di questo tipo sono thread-safe.

Furthermore ci sono due ragioni per le eccezioni IO:

  1. Il metodo GetTempFileName solleverà un'IOException se viene utilizzato per creare più di 65535 file senza eliminare i file temporanei precedenti.

  2. Il metodo GetTempFileName genera un IOException se non è disponibile un nome di file temporaneo univoco. Per risolvere questo errore, elimina tutti i file temporanei non necessari.

mi consiglia di verificare la presenza di queste condizioni (in quanto si afferma esplicitamente che si creano molti file temporanei).

+0

Ho controllato la cartella temporanea di Windows. Non ho trovato più di 1000 file nella cartella."Molti" nel nostro caso significa forse 200-300 file temporanei (totalmente) quando tutte le istanze iniziano a funzionare. Come ho capito "thread safe" non è equivalente a "multi-process save". abbiamo diverse istanze (processi, non discussioni). – constructor