2012-04-27 11 views
7

Tek bir PC'de ağ tipi bir akış benzetmek istiyorum.Ayrı yazma ve okuma konumlarına sahip akış

Bunu, birinden diğerine yazmak için diğerine yazacak 2 temel akışa sahip bir Stream oluşturarak yaptım.

Bu sınıfın 2 akışını değiştirerek 2 örneğini oluşturuyorum. Şu anda 2 temel akım olarak MemoryStream s kullanıyorum.

Şu anki sorunum, X baytını MemoryStream'a yazıyorsa, konum X olacaktır ve daha sonra bir Read yapmam, veri almam, çünkü akışın sonunda olduğumdur.

Genellikle bir çift okuma/yazma yapacağım (bu yüzden her yazının ardından sadece 0'ı sıfırlayamıyorum) Stream bu davranışı almak için kullanabilir miyim?

Etkili Bir akış biçiminde yazabileceğim ve okuyabileceğim bir bayt kuyruğu istiyorum.

yani (görmezden fiili yöntem argümanlar)

O (yine benim durumumda) aslında düşündüğümden çok basittir
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 } 

cevap

8

.
Ben sadece geri /herhangi bir işlem yapmadan önce okuma/yazma konumunu kaydedin:

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

Sadece sorun bu kod parçacığı güvenli değil ise. Bu kodu birden çok ileti dizisiyle kullanıyorsanız, hiçbir şeyin aynı anda okuma ve yazma denemesi yapmayacağından emin olmak istersiniz. Okuma ve Yazma yöntemlerinin üstünde [iş parçacığı] güvenliğini sağlamak için [MethodImpl (MethodImplOptions.Synchronized)] ekleyebilirsiniz. – Qubei