2012-04-27 29 views
7

Tôi muốn mô phỏng luồng loại mạng trên một máy tính.Luồng có vị trí viết và đọc riêng biệt

Tôi đã thực hiện việc này bằng cách tạo một Stream có hai luồng cơ bản, một để đọc và một luồng khác để ghi vào.

Sau đó, tôi tạo 2 trường hợp của lớp này trao đổi 2 luồng. Hiện tại tôi đang sử dụng MemoryStream s làm 2 luồng cơ bản.

Vấn đề tôi có bây giờ là nếu tôi viết X byte thành MemoryStream thì vị trí của nó sẽ là X và nếu sau đó tôi thực hiện Read Tôi không nhận được dữ liệu, vì tôi đang ở cuối luồng.

Cho rằng tôi thường sẽ thực hiện một vài lần đọc/ghi (vì vậy không thể chỉ đặt lại vị trí thành 0 sau mỗi lần viết) số Stream tôi có thể sử dụng để thực hiện hành vi này?

Có hiệu quả tôi muốn một loại hàng đợi byte mà tôi có thể viết và đọc dưới dạng luồng.

ví dụ: (bỏ qua đối số phương pháp thực tế)

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 } 

Trả lời

8

Nó thực sự đơn giản hơn rất nhiều so với tôi nghĩ (trong trường hợp của tôi anyway).
tôi chỉ đơn giản khôi phục/ghi các vị trí đọc/ghi trước khi thực hiện bất kỳ hoạt động:

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

Chỉ vấn đề là mã này không phải là thread an toàn. Nếu bạn đang sử dụng mã này với nhiều luồng, bạn sẽ muốn đảm bảo không có gì cố gọi để đọc và ghi cùng một lúc. Trên phương thức Read và Write, bạn có thể thêm [MethodImpl (MethodImplOptions.Synchronized)] thành (thread) an toàn. – Qubei

Các vấn đề liên quan