2012-11-07 42 views
7

thể trùng lặp:
Synchronizing a timer to prevent overlapLàm thế nào để tạm dừng một Threading.timer để hoàn thành một chức năng

Tôi có một Threading.Timer trong lớp học của tôi.

System.Threading.Timer timer; 
TimerCallback cb = new TimerCallback(ProcessTimerEvent); 
timer = new Timer(cb, reset, 1000, Convert.ToInt64(this.Interval.TotalSeconds)); 

và xác định gọi lại cho nó.

private void ProcessTimerEvent(object obj) 
{ 
    if(value) 
    MyFunction(); 
} 

Khi chạy, hãy chạy lại cuộc gọi trước myfunction để hoàn tất.

Cách tạm dừng Threading.Timer để hoàn tất myfunction?

+0

Tôi nghĩ bạn muốn ngăn [chồng chéo hẹn giờ] (http://stackoverflow.com/questions/684200/synchronizing-a-timer-to-prevent-overlap). –

Trả lời

14

Không cần phải dừng hẹn giờ, bạn có thể để bộ hẹn giờ tiếp tục kích hoạt phương thức gọi lại nhưng bọc mã không lặp lại của bạn trong Monitor.TryEnter/Exit. Không cần phải dừng/khởi động lại bộ hẹn giờ trong trường hợp đó; các cuộc gọi trùng lặp sẽ không lấy được khóa và quay lại ngay lập tức.

object lockObject = new object(); 

private void ProcessTimerEvent(object state) 
{ 
    if (Monitor.TryEnter(lockObject)) 
    { 
    try 
    { 
     // Work here 
    } 
    finally 
    { 
     Monitor.Exit(lockObject); 
    } 
    } 
} 
+0

+1 Giải pháp hay. –

6

Bạn có thể tắt System.Threading.Timer bằng cách thay đổi khoảng thời gian. Bạn có thể làm điều này bằng cách gọi:

timer.Change(Timeout.Infinite, Timeout.Infinite); 

Bạn sẽ phải thay đổi khoảng thời gian trở lại một khi bạn đã hoàn thành việc gọi myfunction nếu bạn muốn bộ đếm thời gian để tiếp tục bắn một lần nữa.

Các vấn đề liên quan