2012-04-25 22 views
6

Tôi muốn đọc và viết các loại giá trị byte và có cấu trúc, không đồng bộ, mà không phải lo lắng về bộ giải mã và dịch chuyển byte: có điều gì đó ở đó cho phép tôi làm điều đó không?BinaryReader không đồng bộ và BinaryWriter trong .Net?

+0

còn về 'Stream.BeginRead' etc? –

+0

Đó là trên Luồng chứ không phải BinaryReader và BinaryWriter. – Henrik

+0

bạn muốn đọc/ghi byte; bạn không cần một 'BinaryReader' /' BinaryWriter' cho điều đó - chúng thực sự tích cực vô ích đối với mục đích đó. –

Trả lời

7

Không thể với BinaryReader hoặc BinaryWriter. Bạn có thể đọc đồng thời từ cơ bản BaseStream, nhưng documentation tiểu bang sau đây:

Sử dụng dòng cơ bản trong khi đọc hoặc khi sử dụng BinaryReader có thể gây mất dữ liệu và tham nhũng. Ví dụ: các byte giống nhau có thể được đọc nhiều lần, các byte có thể bị bỏ qua hoặc việc đọc ký tự có thể trở thành không thể đoán trước.

Do đó, cách duy nhất là cuộn triển khai của riêng bạn. Nhưng lợi ích của việc đó là gây tranh cãi. Marco Greg từ Microsoft thêm những nhận xét sau đây để các bài viết blog Should I expose asynchronous wrappers for synchronous methods?:

Jon: Lý do mà các BinaryReader/Writer không có phương pháp XxxAsync là các phương pháp trên những loại thường đọc/ghi chỉ rất ít byte từ một luồng cơ bản đã được mở trước đó. Trong thực tế, dữ liệu thường được lưu vào bộ nhớ cache và thời gian cần thiết để tìm nạp dữ liệu từ nguồn cơ bản thường quá nhỏ đến mức không đáng làm việc đó một cách không đồng bộ.

Đáng chú ý, có một số phương pháp về các loại này trong một số trường hợp có thể chuyển lượng dữ liệu lớn hơn (ví dụ: ReadString). Hơn nữa xuống dòng, phiên bản Async cho những phương pháp có thể hoặc không thể được thêm vào, nhưng nó không chắc nó sẽ xảy ra trong tương lai gần. Nói chung, bạn chỉ nên xem xét các phương thức Async IO nếu lượng dữ liệu bạn đang đọc là quan trọng (ít nhất là vài trăm hoặc hàng nghìn byte), hoặc nếu bạn đang truy cập tài nguyên lần đầu tiên (ví dụ: đọc từ một tập tin có thể yêu cầu để quay lên đĩa ngay cả khi bạn đang đọc một byte).

Điều này nghe có vẻ hợp lý. Nếu bạn cần một giải pháp, có một số cách giải quyết ngoài việc tự mình lăn BinaryReader/BinaryWriter của riêng bạn. Bạn có thể chạy nó trong một thread riêng biệt (có thể không hiệu quả) hoặc nếu bạn sẵn sàng để thay đổi định dạng tập tin hoặc dây giao thức bạn có thể sử dụng mô hình này (pseudo-code):

//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)) 
{ 
    //... 
} 

Xin lưu ý rằng điều này mô hình chỉ hữu ích nếu bộ đệm hoàn chỉnh dễ dàng phù hợp với bộ nhớ và hiệu suất đó có thể bị ảnh hưởng.

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