So sánh Hẹn giờ với DispatcherTimer


98

sự khác biệt là gì between System.Windows.Forms.Timer()System.Windows.Threading.DispatcherTimer()? Trong những trường hợp nào, chúng ta nên sử dụng chúng? bất kỳ thực hành tốt nhất?

Câu trả lời:


111

Windows.Forms.Timersử dụng vòng lặp thông báo dạng cửa sổ để xử lý các sự kiện hẹn giờ. Nó nên được sử dụng khi viết các sự kiện thời gian đang được sử dụng trong các ứng dụng Windows Forms và bạn muốn bộ hẹn giờ kích hoạt trên chuỗi giao diện người dùng chính.

DispatcherTimerlà cơ chế định thời WPF. Nó nên được sử dụng khi bạn muốn xử lý thời gian theo cách tương tự (mặc dù điều này không giới hạn ở một luồng duy nhất - mỗi luồng có bộ điều phối riêng) và bạn đang sử dụng WPF. Nó kích hoạt sự kiện trên cùng một chuỗi với Dispatcher.

Nói chung, WPF == DispatcherTimerWindows Forms == Forms.Timer.

Điều đó đang được nói, System.Threading.Timerđó là một bộ đếm thời gian classkích hoạt trên một chuỗi riêng biệt. Điều này rất tốt cho thời gian hoàn toàn bằng số, khi bạn không cố cập nhật giao diện người dùng, v.v.


1
Cảm ơn vì phản hồi kịp thời của bạn. Vì vậy, điều này có nghĩa là, bất cứ khi nào tôi muốn có bộ đếm thời gian liên quan đến giao diện người dùng, tôi nên sử dụng DispatcherTimer và khi tôi muốn kích hoạt bộ hẹn giờ mà tôi không muốn đóng băng UL, tôi nên sử dụng System.Threading.Timer trong một tách biệt sợi chỉ. Câu hỏi thứ hai là: nếu tôi muốn sử dụng DispatcherTimer và tôi muốn có bộ đếm thời gian không bị ràng buộc với giao diện người dùng, tôi có nên gọi nó trong một chuỗi riêng biệt bằng cách sử dụng System.Threading.Timer hay vẫn là DisptacherTimer?
paradisonoir

3
Nó phụ thuộc vào những gì bạn đang cố gắng làm. Tôi hiếm khi sử dụng System.Threading.Timer - Tôi thường dính vào Dispatcher Timer, và sau đó thực hiện CÔNG VIỆC của bạn (đó là thứ có thể chặn giao diện người dùng của bạn) trong một chuỗi khác, bằng cách sử dụng một cái gì đó như BackgroundWorker. Bộ hẹn giờ thực sự không bao giờ được chặn giao diện người dùng của bạn, trừ khi bạn đang làm việc "quá nhiều" trong trình xử lý sự kiện của chúng.
Reed Copsey

Tôi đang gặp sự cố với việc DispatcherTimer ngốn bộ xử lý theo thời gian. Có một cách tốt để xử lý điều đó?
discorax

Kiểm tra xem cụ thể điều gì đang ăn mòn cpu. Bạn có đang tạo nhiều bộ hẹn giờ không bị dừng lại không?
Reed Copsey

3
Đảm bảo rằng bạn đặt thuộc tính khoảng thời gian chính xác. Đừng làm điều này: timer1.Interval = new TimeSpan (1000); // "1000" đại diện cho tích tắc không phải mili giây! CPU quá cao, cho đến khi tôi sửa nó bằng cách này: timer1.Interval = System.TimeSpan.FromSeconds (1);
Lonnie Best

4

Tôi đã tìm thấy bài viết hay về bộ tính giờ với các ví dụ nhỏ ở đây: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

Là một kết luận:

Nếu DoSomething () thao tác các thành phần GUI thì với Bộ hẹn giờ bạn cần sử dụng: this.Dispatcher.Invoke ((Hành động) ủy nhiệm {// MÃ LIÊN QUAN ĐẾN GUI TẠI ĐÂY} vì bạn không thể truy cập trực tiếp các điều khiển GUI từ một luồng khác. Với DispatcherTimer, bạn sẽ làm được không cần phải làm điều đó.

Nếu DoSomething () thực hiện một tác vụ tốn thời gian, thì GUI sẽ bị đóng băng trong trường hợp của DispatcherTimer. Trong trường hợp của Timer, nó sẽ không vì các methos dài được thực thi trong một luồng khác

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.