2012-04-27 14 views
7

Quiero emular una transmisión de tipo de red en una sola PC.Stream que tiene posiciones de escritura y lectura separadas

He hecho esto creando un Stream que toma en 2 flujos subyacentes, uno para leer y otro para escribir.

Luego creo 2 instancias de esta clase intercambiando las 2 transmisiones. Actualmente estoy usando MemoryStream s como las 2 transmisiones subyacentes.

El problema que tengo ahora es que si escribo X bytes en un MemoryStream, entonces su posición será X y si hago un Read no obtendré datos, ya que estoy al final de la transmisión.

Dado que normalmente haré un par de lecturas/escrituras (así que no puedo simplemente restablecer la posición a 0 después de cada escritura) ¿qué puedo usar Stream para obtener este comportamiento?

Efectivamente quiero un tipo de cola de bytes en la que pueda escribir y leer en forma de una secuencia.

decir (haciendo caso omiso de los argumentos de métodos reales)

MyStream.Write({ 1, 2, 3, 4, 5, 6 }); 
MyStream.Write({ 7, 8 }); 
MyStream.Read(3) // Returns { 1, 2, 3 } 
MyStream.Read(4) // Returns { 4, 5, 6, 7 } 

Respuesta

8

En realidad es mucho más sencillo de lo que pensaba (en mi caso de todos modos).
simplemente restaurar/grabar las posiciones de lectura/escritura antes de realizar cualquier operación:

public class QueueStream : MemoryStream 
{ 
    long ReadPosition; 
    long WritePosition; 

    public QueueStream() : base() { } 

    public override int Read(byte[] buffer, int offset, int count) 
    { 
     Position = ReadPosition; 

     var temp = base.Read(buffer, offset, count); 

     ReadPosition = Position; 

     return temp; 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     Position = WritePosition; 

     base.Write(buffer, offset, count); 

     WritePosition = Position; 
    } 
} 
+0

El único problema es que este código no es seguro para subprocesos. Si está utilizando este código con múltiples hilos, querrá asegurarse de que nada intente llamar a leer y escribir al mismo tiempo. Sobre los métodos de lectura y escritura, puede agregar [MethodImpl (MethodImplOptions.Synchronized)] para que sea (thread) seguro. – Qubei

Cuestiones relacionadas