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?
Trả lời
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.
- 1. Chúng ta có cần đóng C# BinaryWriter hoặc BinaryReader trong một khối sử dụng không?
- 2. Tệp không đồng bộ IO trong .Net
- 3. Giao tiếp TCP không đồng bộ trong .NET
- 4. XmlReader không đồng bộ trong .NET?
- 5. .NET HTTPClient Hạn chế không đồng bộ
- 6. Rx in .Net 3.5 không đồng bộ?
- 7. .NET C# Nhận đồng bộ không chặn
- 8. Postback không đồng bộ và đồng bộ trong ASP.NET
- 9. Do Bộ định thời .NET chạy không đồng bộ?
- 10. Cuộc gọi ủy nhiệm không đồng bộ về lửa và không đồng bộ trong C#
- 11. Hợp đồng mã và không đồng bộ
- 12. Gọi lại đồng bộ và không đồng bộ
- 13. Ngôn ngữ đồng bộ và không đồng bộ
- 14. Hoạt động đồng bộ và không đồng bộ
- 15. .NET ThreadPool QueueUserWorkItem Đồng bộ hóa
- 16. Thư viện đồng bộ hóa tệp .NET
- 17. Đồng bộ hóa chủ đề .NET
- 18. StreamReader vs BinaryReader?
- 19. EndOfStream cho BinaryReader
- 20. Đồng bộ hóa cuộc gọi không đồng bộ trong C#
- 21. Quy trình đồng bộ hóa đọc-ghi chéo trong .NET.
- 22. IO không đồng bộ trong Java?
- 23. Sự khác biệt giữa [...] Async và Begin [...] .net không đồng bộ API
- 24. Chủ đề và phiên không đồng bộ
- 25. System.Data.IDbCommand và thực thi không đồng bộ?
- 26. Chúng ta có cần một bộ xử lý lệnh đồng bộ và không đồng bộ trong CQRS không?
- 27. Collections.synchronizedList và đồng bộ
- 28. TFS không đồng bộ giữa cục bộ và từ xa - cách "đồng bộ hóa lại"?
- 29. Không đồng bộ POST trên WP7 và F #
- 30. EHsc vc EHa (xử lý ngoại lệ không đồng bộ và không đồng bộ)
còn về 'Stream.BeginRead' etc? –
Đó là trên Luồng chứ không phải BinaryReader và BinaryWriter. – Henrik
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 đó. –