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

121

Chương 4: Tiểu trình, tiến trình, và sự đồng bộ

2.

2.

Th c thi ph

ng th c m t cách b t đ ng b

ươ

ứ ộ

ấ ồ

Th c thi ph

ng th c m t cách b t đ ng b

ươ

ứ ộ

ấ ồ

Bạn cần thực thi một phương thức và tiếp tục thực hiện các công việc khác trong
khi phương thức này vẫn chạy trong một tiểu trình riêng biệt. Sau khi phương
thức đã hoàn tất, bạn cần lấy trị trả về của nó.

Khai báo một ủy nhiệm có chữ ký giống như phương thức cần thực thi. Sau đó,
tạo một thể hiện của ủy nhiệm tham chiếu đến phương thức này. Tiếp theo, gọi
phương thức

BeginInvoke

của thể hiện ủy nhiệm để thực thi phương thức của

bạn. Kế đến, sử dụng phương thức

EndInvoke

để kiểm tra trạng thái của phương

thức cũng như thu lấy trị trả về của nó nếu đã hoàn tất.

Khi cho gọi một phương thức, chúng ta thường thực hiện một cách đồng bộ; nghĩa là mã lệnh
thực hiện lời gọi phải đi vào trạng thái dừng (block) cho đến khi phương thức được thực hiện
xong. Đây là cách cần thiết khi mã lệnh yêu cầu quá trình thực thi phương thức phải hoàn tất
trước khi nó có thể tiếp tục. Tuy nhiên, trong một số trường hợp, bạn lại cần thực thi phương
thức một cách bất đồng bộ; nghĩa là bạn cho thực thi phương thức này trong một tiểu trình
riêng trong khi vẫn tiếp tục thực hiện các công việc khác.
.NET Framework hỗ trợ chế độ thực thi bất đồng bộ, cho phép bạn thực thi bất kỳ phương
thức nào một cách bất đồng bộ bằng một ủy nhiệm. Khi khai báo và biên dịch một ủy nhiệm,
trình biên dịch sẽ tự động sinh ra hai phương thức hỗ trợ chế độ thực thi bất đồng bộ:

BeginInvoke

EndInvoke

. Khi bạn gọi phương thức

BeginInvoke

của một thể hiện ủy nhiệm,

phương thức được tham chiếu bởi ủy nhiệm này được xếp vào hàng đợi để thực thi bất đồng
bộ. Quyền kiểm soát quá trình thực thi được trả về cho mã gọi

BeginInvoke

ngay sau đó, và

phương thức được tham chiếu sẽ thực thi trong ngữ cảnh của tiểu trình sẵn sàng trước tiên
trong thread-pool.
Các đối số của phương thức

BeginInvoke

gồm các đối số được chỉ định bởi ủy nhiệm, cộng

với hai đối số dùng khi phương thức thực thi bất đồng bộ kết thúc. Hai đối số này là:

Một thể hiện của ủy nhiệm

System.AsyncCallback

tham chiếu đến phương thức mà bộ

thực thi sẽ gọi khi phương thức thực thi bất đồng bộ kết thúc. Phương thức này sẽ được
thực thi trong ngữ cảnh của một tiểu trình trong thread-pool. Truyền giá trị

null

cho đối

số này nghĩa là không có phương thức nào được gọi và bạn phải sử dụng một cơ chế
khác để xác định khi nào phương thức thực thi bất bộ kết thúc (sẽ được thảo luận bên
dưới).

Một tham chiếu đối tượng mà bộ thực thi sẽ liên kết với quá trình thực thi bất đồng bộ.
Phương thức thực thi bất đồng bộ không thể sử dụng hay truy xuất đến đối tượng này,
nhưng mã lệnh của bạn có thể sử dụng nó khi phương thức này kết thúc, cho phép bạn
liên kết thông tin trạng thái với quá trình thực thi bất đồng bộ. Ví dụ, đối tượng này cho
phép bạn ánh xạ các kết quả với các thao tác bất đồng bộ đã được khởi tạo trong trường
hợp bạn khởi tạo nhiều thao tác bất đồng bộ nhưng sử dụng chung một phương thức
callback để xử lý việc kết thúc.

Phương thức

EndInvoke

cho phép bạn lấy trị trả về của phương thức thực thi bất đồng bộ,

nhưng trước hết bạn phải xác định khi nào nó kết thúc. Dưới đây là bốn kỹ thuật dùng để xác
định một phương thức thực thi bất đồng bộ đã kết thúc hay chưa:

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.