367
Chương 9: File, thư mục, và I/O
9.
9.
Đ c file m t cách b t đ ng b
ọ
ộ
ấ ồ
ộ
Đ c file m t cách b t đ ng b
ọ
ộ
ấ ồ
ộ
Bạn cần đọc dữ liệu từ một file mà không phải dừng quá trình thực thi mã lệnh
của bạn. Kỹ thuật này thường được sử dụng khi file được lưu trữ trong một nơi
có tốc độ truy xuất chậm (chẳng hạn một đĩa mạng).
Tạo một lớp để đọc file một cách bất đồng bộ. Bắt đầu đọc một khối dữ liệu bằng
phương thức
FileStream.BeginRead
, và truyền phương thức callback. Khi
callback được kích hoạt, gọi
FileStream.EndRead
để truy xuất dữ liệu, xử lý nó,
và đọc khối dữ liệu kế tiếp với
BeginRead
.
FileStream
hỗ trợ hoạt động bất đồng bộ thông qua phương thức
BeginRead
và
EndRead
. Sử
dụng các phương thức này, bạn có thể đọc một khối dữ liệu trên một trong các tiểu trình do
thread-pool cung cấp mà không cần sử dụng trực tiếp các lớp tiểu trình trong không gian tên
System.Threading
.
Khi đọc file một cách bất đồng bộ, bạn cần xác định kích thước khối dữ liệu trong một lần
đọc. Tùy trường hợp, bạn có thể muốn đọc một khối dữ liệu nhỏ (ví dụ, chép từng khối một
sang file khác) hoặc khối dữ liệu tương đối lớn (ví dụ, bạn cần một lượng thông tin nhất định
trước khi xử lý việc gì đó). Bạn chỉ định kích thước khối khi gọi
BeginRead
, và truyền một bộ
đệm để chứa dữ liệu. Vì
BeginRead
và
EndRead
cần truy xuất nhiều mẩu thông tin giống nhau
(chẳng hạn
FileStream
, bộ đệm, kích thước khối,...), bạn nên đóng gói mã lệnh đọc file bất
đồng bộ trong một lớp.
Với lớp
AsyncProcessor
trong ví dụ dưới đây, phương thức công khai
StartProcess
bắt đầu
quá trình đọc bất đồng bộ. Mỗi khi quá trình đọc hoàn tất,
OnCompletedRead
được kích hoạt và
khối dữ liệu được xử lý. Nếu còn dữ liệu trong file, một quá trình đọc bất đồng bộ mới sẽ
được khởi chạy. Kích thước khối bộ nhớ là 2 KB (2048 byte).
using System;
using System.IO;
using System.Threading;
public class AsyncProcessor {
private Stream inputStream;
// Kích thước mỗi khối dữ liệu là 2 KB.
private int bufferSize = 2048;
public int BufferSize {
get {return bufferSize;}
set {bufferSize = value;}
}