sirve que programacion para net lenguaje historia ejemplo caracteristicas c# asynchronous filesystems async-await system.io.file

c# - que - ¿El.net framework proporciona métodos asíncronos para trabajar con el sistema de archivos?



para que sirve c# (5)

¿Tiene .net framework una biblioteca / conjunto async que permite trabajar con el sistema de archivos (por ejemplo, File.WriteAllBytes , File.WriteAllBytes )?

¿O tengo que escribir mi propia biblioteca usando los métodos async de StreamReader y StreamWriter ?

Algo como esto sería bastante bueno:

var bytes = await File.ReadAllBytes("my-file.whatever");


¿El .net framework tiene una biblioteca / ensamblaje integrado asíncrono que permite trabajar con el sistema de archivos?

Sí. Existen métodos asíncronos para trabajar con el sistema de archivos pero no para los métodos auxiliares en el tipo de File estático. Ellos están en FileStream .

Entonces, no hay File.ReadAllBytesAsync pero hay FileStream.ReadAsync , etc. Por ejemplo:

byte[] result; using (FileStream stream = File.Open(@"C:/file.txt", FileMode.Open)) { result = new byte[stream.Length]; await stream.ReadAsync(result, 0, (int)stream.Length); }


¿Tiene .net framework una biblioteca / conjunto asíncrono que permite trabajar con el sistema de archivos (por ejemplo, File.ReadAllBytes, File.WriteAllBytes)?

Desafortunadamente, las API de escritorio son un poco irregulares cuando se trata de operaciones de archivos asíncronas. Como notó, algunos de los métodos de conveniencia agradable no tienen equivalentes asíncronos. También faltan la apertura asíncrona de archivos (que es especialmente útil cuando se abren archivos a través de un recurso compartido de red).

Espero que estas API se agreguen a medida que el mundo se mueva a .NET Core.

¿O tengo que escribir mi propia biblioteca usando los métodos asíncronos de StreamReader y StreamWriter?

Ese es el mejor enfoque en este momento.

Tenga en cuenta que al usar ReadAsync / WriteAsync y amigos, debe abrir explícitamente el archivo para el acceso asíncrono. La única manera de hacer esto (actualmente) es usar una sobrecarga del constructor FileStream que tome un parámetro bool isAsync (que pasa true ) o un parámetro FileOptions (que pasa FileOptions.Asynchronous ). Así que no puedes usar los métodos abiertos de conveniencia como File.Open .



Si tiene que escribir un archivo en una tarea en segundo plano, puede escribirlo de manera sincronizada en un método asíncrono.

static void Main(string[] args) { Console.WriteLine("1"); // thread 1, sync byte[] dataToWrite = System.Text.ASCIIEncoding.ASCII.GetBytes("my custom data"); Task.Run(() => { Console.WriteLine("2"); // aspetto un secondo System.Threading.Thread.Sleep(1000); // thread 2, async code System.IO.File.WriteAllBytes(@"c:/temp/prova.txt", dataToWrite); Console.WriteLine("2, end"); }); Console.WriteLine("3, exit"); Console.ReadLine(); // thread 1 }

La salida de ejecución será: 1,3,2,2 final.


Ya lo hace. Consulte, por ejemplo, Cómo usar Async para el acceso a archivos de MSDN.

private async Task WriteTextAsync(string filePath, string text) { byte[] encodedText = Encoding.Unicode.GetBytes(text); using (FileStream sourceStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true)) { await sourceStream.WriteAsync(encodedText, 0, encodedText.Length); }; }