132
Chương 4: Tiểu trình, tiến trình, và sự đồng bộ
Mặc dù
Timer
thường được sử dụng để gọi thực thi các phương thức ở những thời khoảng,
nhưng nó cũng cung cấp cách thức để thực thi một phương thức ở một thời điểm xác định.
Bạn cần phải tính toán khoảng thời gian từ thời điểm hiện tại đến thời điểm cần thực thi. Ví dụ
dưới đây sẽ thực hiện điều này:
public static void RunAt(DateTime execTime) {
// Tính khoảng thời gian từ thời điểm hiện tại
// đến thời điểm cần thực thi.
TimeSpan waitTime = execTime - DateTime.Now;
if (waitTime < new TimeSpan(0)) waitTime = new TimeSpan(0);
// Tạo một thể hiện ủy nhiệm TimerCallback mới
// tham chiếu đến phương thức tĩnh TimerHandler.
// TimerHandler sẽ được gọi khi Timer hết hiệu lực.
TimerCallback handler = new TimerCallback(TimerHandler);
// Tạo một Timer chỉ phát sinh một lần tại thời điểm
// được chỉ định. Chỉ định thời khoảng thứ hai là -1
// để ngăn Timer thực thi lặp lại phương thức.
new Timer(handler, null, waitTime, new TimeSpan(-1));
}
4.
4.
Th c thi ph
ng th c b ng cách ra hi u đ i t
ng WaitHandle
ự
ươ
ứ ằ
ệ ố ượ
Th c thi ph
ng th c b ng cách ra hi u đ i t
ng WaitHandle
ự
ươ
ứ ằ
ệ ố ượ
Bạn muốn thực thi một hay nhiều phương thức một cách tự động khi một đối
tượng dẫn xuất từ lớp
System.Threading.WaitHandle
đi vào trạng thái signaled.
Tạo một thể hiện ủy nhiệm
System.Threading.WaitOrTimerCallback
tham chiếu
đến phương thức cần thực thi. Sau đó, đăng ký thể hiện ủy nhiệm và đối tượng
WaitHandle
với thread-pool bằng phương thức tĩnh
ThreadPool.
RegisterWaitForSingleObject
.
Bạn có thể sử dụng các lớp dẫn xuất từ
WaitHandle
(đã được thảo luận trong mục 4.2) để gọi
thực thi một phương thức. Bằng phương thức
RegisterWaitForSingleObject
của lớp
ThreadPool
, bạn có thể đăng ký thể hiện ủy nhiệm
WaitOrTimerCallback
với thread-pool khi
một đối tượng dẫn xuất từ
WaitHandle
đi vào trạng thái signaled. Bạn có thể cấu hình thread-
pool để thực thi phương thức chỉ một lần hay tự động đăng ký lại phương thức mỗi khi
WaitHandle
đi vào trạng thái signaled. Nếu
WaitHandle
đã ở trạng thái signaled khi bạn gọi
RegisterWaitForSingleObject
, phương thức sẽ thực thi ngay lập tức. Phương thức