Một sự khác biệt là System.Threading.Timer gửi cuộc gọi lại trên chuỗi chủ đề chuỗi, thay vì tạo chuỗi mới mỗi lần. Nếu bạn cần điều này xảy ra nhiều lần trong suốt quá trình ứng dụng, điều này sẽ tiết kiệm chi phí cho việc tạo và hủy một loạt các luồng (một quá trình rất tốn tài nguyên, như bài báo bạn chỉ ra), vì nó sẽ chỉ cần sử dụng lại các chủ đề trong hồ bơi, và nếu bạn sẽ có nhiều hơn một bộ đếm thời gian đi cùng một lúc nó có nghĩa là bạn sẽ có ít đề tài chạy cùng một lúc (cũng tiết kiệm tài nguyên đáng kể).
Nói cách khác, Bộ hẹn giờ sẽ hiệu quả hơn nhiều. Nó cũng có thể chính xác hơn, vì Thread.Sleep chỉ được đảm bảo chờ đợi ở mức LEAST miễn là số lượng thời gian bạn chỉ định (hệ điều hành có thể đặt nó vào giấc ngủ lâu hơn nữa). Cấp, Timer vẫn sẽ không chính xác chính xác, nhưng mục đích là kích hoạt callback càng gần thời gian được chỉ định càng tốt, trong khi điều này KHÔNG nhất thiết là ý định của Thread.Sleep.
Để hủy bộ hẹn giờ, cuộc gọi lại có thể chấp nhận tham số, vì vậy bạn có thể tự chuyển thông số hẹn giờ làm tham số và gọi Vứt bỏ trong cuộc gọi lại (mặc dù tôi chưa thử - tôi đoán là có thể là Bộ hẹn giờ có thể bị khóa trong khi gọi lại).
Chỉnh sửa: Không, tôi đoán bạn không thể thực hiện việc này, vì bạn phải chỉ định tham số gọi lại trong chính hàm tạo bộ đếm giờ.
Có thể giống như thế này? (Một lần nữa, đã không thực sự cố gắng nó)
class TimerState
{
public Timer Timer;
}
... và bắt đầu hẹn giờ:
TimerState state = new TimerState();
lock (state)
{
state.Timer = new Timer((callbackState) => {
action();
lock (callbackState) { callbackState.Timer.Dispose(); }
}, state, millisecond, -1);
}
Các khóa nên ngăn chặn sự hẹn giờ gọi lại từ cố gắng để giải phóng bộ đếm thời gian trước khi Timer trường đã được đặt.
Phụ Lục: Khi commenter chỉ ra, nếu hành động() làm điều gì đó với giao diện người dùng, sau đó sử dụng một System.Windows.Forms.Timer có lẽ là một cược tốt hơn, vì nó sẽ chạy callback trên giao diện người dùng chủ đề. Tuy nhiên, nếu đây không phải là trường hợp, và nó xuống Thread.Sleep vs. Threading.Timer, Threading.Timer là con đường để đi.
Nó cũng đáng để chỉ ra sự khác biệt với System.Windows.Forms.Timer, mà tôi * tin * gọi một hàm trên chuỗi giao diện người dùng, điều này thực sự quan trọng đối với các ứng dụng WinForms! –
Đối với người đọc trong tương lai, 'Sleep' không phải là sự kiện được đảm bảo là ÍT NHẤT, nó được ghi nhận rằng nó có thể ít hơn. –
Ngoài sự tò mò ... tài liệu đó ở đâu? –