CÁC GIẢI PHÁP LẬP TRÌNH C# - Trang 367

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

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

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;}

}

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.