Poiché devo eseguire molte operazioni di I/O su file nella mia applicazione, , ho deciso di implementarle in modo asincrono. Guardando in MSDN, non ci sono controparti asincrone per File.Create, File.Delete e File.Move. Come ho imparato, il motivo è la non esistenza di un'implementazione asincrona Win32 per eliminazione dei file, creare o spostare, quindi ho finito con la seguente soluzione:Come implementare un file asincrono. Elimina/Crea/Sposta?
public static Task DeleteAsync(string path)
{
Guard.FileExists(path);
return Task.Run(() => File.Delete(path));
}
public static Task<FileStream> CreateAsync(string path)
{
Guard.IsNotNullOrWhitespace(path);
return Task.Run(() => File.Create(path));
}
public static Task MoveAsync(string sourceFileName, string destFileName)
{
Guard.FileExists(sourceFileName);
Guard.IsNotNullOrWhitespace(destFileName);
return Task.Run(() => { File.Move(sourceFileName, destFileName); });
}
Considerando il paradigma "Don’t use Task.Run in Libraries", mi chiedo se c'è un migliore implementazione o dovrei ricorrere al codice sincrono?
Molte grazie in anticipo!
Modifiche:
- Migliorato il codice basato su Pietro Duniho raccomandazione
- Aggiunto il link al post originale fornito da Sriram Sakthivel
Chi dice "non utilizzare' Task.Run() 'nelle librerie"? Come pensi di poter eseguire i metodi sincroni senza usare quello o qualcosa di simile? C'è qualcosa di veramente sbagliato nell'implementazione che hai? –
@PeterDuniho È la raccomandazione di stephen cleary. Ti consiglia di non utilizzare 'Task.Run' nell'implementazione, se hai bisogno di avvolgere il metodo sincrono come operazione asincrona, quindi fallo nel codice client dove ti serve.Modifica: anche Stephen toub dice che non esporre il wrapper asincrono su metodi sincroni. –
A proposito, le implementazioni sembrano meno che perfette. I metodi dovrebbero tutti solo restituire il 'Task' (senza configurare attendere, e senza che i metodi siano' async'). 'CreateAsync()' può 'restituire Task.Run (() => File.Create (path));' (cioè l'attività attendibile restituita dovrebbe restituire di per sé l'oggetto 'FileStream' ... non è necessario attendere te stesso per farlo , né usare l'acquisizione variabile per realizzarlo). –