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

147

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

lock (consoleGate) {

// Pulse tất cả các tiểu trình đang chờ.

Monitor.PulseAll(consoleGate);

}

// Nhấn Enter để kết thúc.

Console.WriteLine("Main method complete. Press Enter.");

Console.ReadLine();

}

}

Các lớp thông dụng khác dùng để đồng bộ hóa tiểu trình là các lớp con của lớp

System.Threading.WaitHandle

, bao gồm

AutoResetEvent

,

ManualResetEvent

, và

Mutex

. Thể

hiện của các lớp này có thể ở trạng thái signaled hay unsignaled. Các tiểu trình có thể sử dụng
các phương thức của các lớp được liệt kê trong bảng 4.2 (được thừa kế từ lớp

WaitHandle

) để

đi vào trạng thái

WaitSleepJoin

và đợi trạng thái của một hay nhiều đối tượng dẫn xuất từ

WaitHandle

biến thành signaled.

Bảng 4.2 Các phương thức của WaitHandle dùng để đồng bộ hóa quá trình thực thi của các tiểu
trình

Phương thức

Mô tả

WaitAny

Tiểu trình gọi phương thức tĩnh này sẽ đi vào trạng thái

WaitSleepJoin

và đợi bất kỳ một trong các đối tượng

WaitHandle

thuộc một mảng

WaitHandle

biến thành signaled. Bạn cũng có thể chỉ định giá trị time-

out.

WaitAll

Tiểu trình gọi phương thức tĩnh này sẽ đi vào trạng thái

WaitSleepJoin

và đợi tất cả các đối tượng

WaitHandle

trong một mảng

WaitHandle

biến

thành signaled. Bạn cũng có thể chỉ định giá trị time-out. Phương thức

WaitAllExample

trong mục 4.2 đã trình bày cách sử dụng phương thức

WaitAll

.

WaitOne

Tiểu trình gọi phương thức này sẽ đi vào trạng thái

WaitSleepJoin

đợi một đối tượng

WaitHandle

cụ thể biến thành signaled. Phương thức

WaitingExample

trong mục 4.2 đã trình bày cách sử dụng phương thức

WaitOne

.

Điểm khác biệt chính giữa các lớp

AutoResetEvent

,

ManualResetEvent

, và

Mutex

là cách thức

chúng chuyển trạng thái từ signaled thành unsignaled, và tính khả kiến (visibility) của chúng.
Lớp

AutoResetEvent

ManualResetEvent

là cục bộ đối với một tiến trình. Để ra hiệu một

AutoResetEvent

, bạn hãy gọi phương thức

Set

của nó, phương thức này chỉ giải phóng một

tiểu trình đang đợi sự kiện.

AutoResetEvent

sẽ tự động trở về trạng thái unsignaled. Ví dụ

trong mục 4.4 đã trình bày cách sử dụng lớp

AutoResetEvent

.

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.