Hãy nói rằng tôi có một thể hiện System.Threading.Timer hiện và tôi muốn kêu gọi thay đổi vào nó để đẩy nó bắn thời gian trở lại:"nguyên tử" thay đổi một System.Threading.Timer
var timer = new Timer(DelayCallback, null, 10000, Timeout.Infinite);
// ... (sometime later but before DelayCallback has executed)
timer.Change(20000, Timeout.Infinite);
tôi đang sử dụng bộ hẹn giờ này để thực hiện "cuộc gọi nhàn rỗi" sau một khoảng thời gian không có hoạt động. ("Không hoạt động" và "không hoạt động" là các điều kiện do ứng dụng xác định trong trường hợp này ... các chi tiết cụ thể không quan trọng lắm.) Mỗi lần tôi thực hiện "hành động", tôi muốn đặt lại bộ hẹn giờ để luôn được đặt để bắn 10 giây sau đó.
Tuy nhiên, có điều kiện chủng tộc cố hữu vì khi tôi gọi Thay đổi, tôi không thể biết Bộ hẹn giờ đã được kích hoạt dựa trên cài đặt cũ của nó hay chưa. (Tôi có thể, tất nhiên, cho biết nếu gọi lại của tôi đã xảy ra nhưng tôi không thể biết liệu chủ đề bộ đếm thời gian nội bộ của CLR đã xếp hàng đợi cuộc gọi lại của tôi đến threadpool và việc thực thi của nó sắp xảy ra chưa.)
Bây giờ tôi biết tôi có thể gọi Vứt bỏ trên trường hợp bộ hẹn giờ và tạo lại mỗi lần tôi cần "đẩy lại". nhưng điều này dường như kém hiệu quả hơn là chỉ thay đổi bộ hẹn giờ hiện có. Tất nhiên nó có thể không được ... Tôi sẽ chạy một số điểm chuẩn vi mô trong một chút và cho bạn biết tất cả.
Ngoài ra, tôi luôn có thể theo dõi thời gian kích hoạt dự kiến (thông qua DateTime.Now.AddSeconds (10)) và nếu Timer ban đầu kích hoạt, bỏ qua nó bằng cách kiểm tra DateTime.Now trong gọi lại. (Tôi có một mối quan tâm dai dẳng rằng điều này có thể không đáng tin cậy 100% trên tài khoản của Timer sử dụng TimeSpan và kiểm tra của tôi bằng cách sử dụng DateTime ... điều này có thể không phải là một vấn đề nhưng tôi không hoàn toàn thoải mái với nó vì lý do nào đó ...)
câu hỏi của tôi là:
- có cách nào tốt cho tôi để gọi Timer.Change và có thể biết liệu tôi có cố gắng thay đổi nó trước khi gọi lại được xếp hàng đợi đến threadpool? (Tôi không nghĩ như vậy, nhưng nó không làm tổn thương để yêu cầu ...)
- Có ai khác đã triển khai (thuật ngữ tôi gọi) là "bộ đếm thời gian phản hồi" như thế này không? Nếu vậy, tôi rất muốn nghe cách bạn giải quyết vấn đề.
Câu hỏi này có phần giả định về bản chất vì tôi đã có một vài giải pháp làm việc (dựa trên Vứt bỏ và dựa trên DateTime.Now) ... Tôi rất quan tâm đến việc nghe các đề xuất liên quan đến hiệu suất (như tôi sẽ được "đẩy lùi" Timer RẤT thường xuyên).
Cảm ơn!