Liệu các khung lưới có một async built-in thư viện/lắp ráp cho phép làm việc với các hệ thống tập tin (ví dụ: File.ReadAllBytes, File.WriteAllBytes)?
Thật không may, các API dành cho máy tính để bàn hơi bị lỗi khi nói đến các hoạt động tệp không đồng bộ. Như bạn đã lưu ý, một số phương pháp tiện lợi tốt đẹp không có tương đương không đồng bộ. Còn thiếu là không đồng bộ mở tệp (đặc biệt hữu ích khi mở tệp qua chia sẻ mạng).
Tôi hy vọng các API này sẽ được thêm khi thế giới di chuyển sang .NET Core.
Hoặc tôi có phải viết thư viện của riêng mình bằng các phương pháp không đồng bộ của StreamReader và StreamWriter không?
Đó là cách tiếp cận tốt nhất ngay bây giờ.
Lưu ý rằng khi sử dụng ReadAsync
/WriteAsync
và bạn bè, bạn phải rõ ràng mở tệp để truy cập không đồng bộ. Cách duy nhất để thực hiện việc này (hiện tại) là sử dụng quá tải hàm khởi tạo FileStream
có thông số bool isAsync
(chuyển true
) hoặc thông số FileOptions
(qua FileOptions.Asynchronous
). Vì vậy, bạn không thể sử dụng các phương thức mở tiện lợi như File.Open
.
Nguồn
2016-03-03 13:34:38
Nếu tệp bạn đã tuần tự hóa thành luồng byte lớn (3gb +) thì có thể cho rằng độ dài luồng sẽ lớn hơn loại int có thể lưu trữ và khiến nó tràn không? – Dave
@Đã có thể. Trong những trường hợp như vậy, bạn có thể cần phải đọc theo khối. – i3arnon
Bạn nên có logic để đọc theo khối bất kể. Theo [tài liệu của Microsoft] (https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream.readasync?view=netframework-4.7.1#System_IO_FileStream_ReadAsync_System_Byte___System_Int32_System_Int32_System_Threading_CancellationToken_), ReadAsync không được bảo đảm để lấp đầy toàn bộ mảng. Bạn cần phải kiểm tra giá trị trả về để xem giá trị _actually_ đã đọc. – Phil