Ho un metodo che accetta FileStream come input. Questo metodo è in esecuzione all'interno di un ciclo for.Come restituire un flusso da un metodo, sapendo che dovrebbe essere eliminato?
private void UploadFile(FileStream fileStream)
{
var stream = GetFileStream();
// do things with stream
}
ho un altro metodo che crea e restituisce il FileStream:
private FileStream GetFileStream()
{
using(FileStream fileStream = File.Open(myFile, FileMode.Open))
{
//Do something
return fileStream;
}
}
Ora il primo metodo genera un ObjectDisposedException
quando provo ad accedere al FileStream tornato, probabilmente perché è già chiuso essendo io utilizzando "using
" per disporre correttamente lo stream.
Se non utilizzo "using" e invece lo uso come segue, quindi FileStream rimane aperto e la successiva iterazione del ciclo (che opera sullo stesso file) genera un'eccezione che indica che il file è già in uso:
private FileStream GetFileStream()
{
FileStream fileStream = File.Open(myFile, FileMode.Open);
//Do something
return fileStream;
}
Se uso un blocco try-fine, in cui chiudo il flusso nella finally
poi getta anche l'ObjectDisposedException
.
Come restituire efficacemente il flusso di file e chiuderlo?
Non puoi chiuderlo, non il tuo lavoro. Usa i buoni nomi. "Get" non è sufficiente per aiutare il programmatore a capire che ha bisogno di smaltire il flusso, utilizzare invece "Crea". –