Me gustaría leer y escribir bytes y tipos de valores estructurados, de forma asincrónica, sin tener que preocuparme por los decodificadores y el byte-cambio: ¿hay algo por ahí que me permita hacer eso?BinaryReader asincrónico y BinaryWriter en .Net?
Respuesta
No es posible con BinaryReader
o BinaryWriter
. Se podía leer simultáneamente desde el BaseStream
subyacente, pero los documentation indica lo siguiente:
Uso de la secuencia subyacente al leer o durante el uso de la BinaryReader puede causar la pérdida de datos y la corrupción. Por ejemplo, los mismos bytes se pueden leer más de una vez, se pueden omitir bytes o la lectura de caracteres puede volverse impredecible.
Por lo tanto, la única forma es ejecutar su propia implementación. Pero el beneficio de hacerlo es discutible. Marco Greg de Microsoft añadió el siguiente comentario al artículo de blog Should I expose asynchronous wrappers for synchronous methods?:
Jon: La razón por la que el BinaryReader/escritor no tienen métodos XxxAsync es que los métodos sobre los tipos normalmente Lectura/Escritura sólo muy pocos bytes de un flujo subyacente que se ha abierto previamente. En la práctica, los datos se almacenan en caché con frecuencia y el tiempo requerido para obtener los datos de la fuente subyacente suele ser tan pequeño que no vale la pena hacerlo de forma asíncrona.
Cabe destacar que hay algunos métodos en estos tipos que en algunas circunstancias pueden transferir grandes cantidades de datos (por ejemplo, ReadString). Más adelante en la línea, las versiones de Async para esos métodos pueden o no agregarse, pero es poco probable que suceda en el futuro inmediato.
En general, solo debe considerar los métodos Async IO si la cantidad de datos que está leyendo es significativa (al menos varios cientos o miles de bytes), o si está accediendo a un recurso por primera vez (por ejemplo, un primer leer desde un archivo puede requerir girar el disco incluso si está leyendo un byte).
Esto suena razonable. Si necesita una solución, existen varias soluciones además de rodar su propia BinaryReader
/BinaryWriter
. Se puede ejecutar en un hilo separado (que puede ser ineficiente) o si usted está dispuesto a cambiar el protocolo de formato de archivo o alambre que podría utilizar este patrón (pseudo-código):
//read packet length
await stream.ReadAsync(buffer);
var packetLength=convertToInt(buffer);
//read complete packet asynchronously
await stream.ReadAsync(buffer,packetLength);
//process packet with BinaryReader
using(var br=new BinaryReader(new MemoryStream(buffer))
{
//...
}
Tenga en cuenta que este el patrón solo es útil si el búfer completo se adapta fácilmente a la memoria y el rendimiento puede verse afectado.
- 1. BinaryReader genérico
- 2. XmlReader asincrónico en .NET?
- 3. Rx en .Net 3.5 no asincrónico?
- 4. ¿Cuántos modelos de desarrollo asincrónico en .NET?
- 5. BinaryWriter Endian problema
- 6. StreamReader vs BinaryReader?
- 7. Soporte asincrónico en ServiceStack y OrmLite
- 8. EndOfStream for BinaryReader
- 9. .net C#: Crear un proceso asincrónico
- 10. MVC4 asincrónico y ejecución paralela
- 11. IO asincrónico en Java?
- 12. Procesamiento asincrónico en SQL Server frente a .NET Procesamiento asíncrono
- 13. NSURLConnection asincrónico y NSOperation - cancelando
- 14. ¿Cómo escribo una lista usando BinaryWriter?
- 15. ¿Por qué un BinaryWriter cierra el Stream externo en la eliminación, y cómo prevenir eso? (.NET C#)
- 16. ¿Cómo "bifurco" un Stream en .NET?
- 17. memcpy asincrónico en Linux?
- 18. CreateProcess asincrónico?
- 19. ¿Cuál es la diferencia entre un delegado asincrónico y el método asincrónico?
- 20. Acceso DLL asincrónico en LabVIEW?
- 21. Inicio del proceso asincrónico y espere a que finalice
- 22. es playframework verdaderamente asincrónico?
- 23. ¿Cómo implemento el almacenamiento en caché asincrónico?
- 24. es node.js 'console.log asincrónico?
- 25. Conector Mysql asincrónico
- 26. Mongoose asincrónico por defecto
- 27. NSURLConnection asincrónico con NSOperation
- 28. Procedimiento almacenado asincrónico Llamadas
- 29. La implementación de tiempo de espera asincrónico utilizando pobres asíncrono Mans/esperan construcciones en .Net 4.0
- 30. ¿Console.dir() en javascript o firefox es asincrónico?
¿Qué tal 'Stream.BeginRead', etc.? –
Eso está en Stream, no en BinaryReader y BinaryWriter. – Henrik
desea leer/escribir bytes; para eso no se necesita un 'BinaryReader' /' BinaryWriter'; de hecho, no ayudan mucho con ese fin. –