2009-07-10 41 views

Trả lời

100

Windows.Forms.Timer sử dụng vòng lặp thông báo biểu mẫu 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 luồng giao diện người dùng chính.

DispatcherTimer là cơ chế thời gian 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 đơn - mỗi luồng có đ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 luồng với Dispatcher.

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

Điều đó đang được nói, cũng có System.Threading.Timer, là bộ hẹn giờ class kích hoạt trên một chuỗi riêng biệt. Điều này là tốt cho thời gian thuần túy số, nơi bạn không cố gắng để cập nhật giao diện người dùng, vv

+1

Cảm ơn phản hồi nhanh chóng của bạn. Vì vậy, điều này có nghĩa, bất cứ khi nào tôi muốn có một 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 cháy một bộ đếm thời gian, mà tôi không muốn đóng băng UL, tôi nên sử dụng System.Threading.Timer trong một riêng biệt chủ đề. Câu hỏi thứ hai là: nếu tôi muốn sử dụng DispatcherTimer, và tôi muốn có một bộ đếm thời gian không bị ràng buộc với giao diện người dùng, tôi nên gọi nó trong một chủ đề riêng biệt bằng cách sử dụng System.Threading.Timer hoặc vẫn 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 sẽ dính vào Dispatcher Timer, và sau đó làm công việc của bạn (đó là những gì có thể chặn giao diện người dùng của bạn) trong một chủ đề khác, sử dụng một cái gì đó giống như một BackgroundWorker. Bộ hẹn giờ thực sự không bao giờ nên chặn giao diện người dùng của bạn, trừ khi bạn đang thực hiện công việc "quá nhiều" trong trình xử lý sự kiện của họ. –

+0

Tôi đang gặp sự cố với DispatcherTimer khi ăn xử lý theo thời gian. Có cách nào tốt để xử lý điều đó không? – discorax

4

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

Như một kết luận:

Nếu DoSomething() thao tác các thành phần GUI thì với Timer bạn cần sử dụng: this.Dispatcher.Invoke ((Action) delegate {// GUI RELATED CODE HERE} vì bạn không thể truy cập các điều khiển GUI trực tiếp. Với DispatcherTimer bạn không cần phải làm điều đó.

Nếu DoSomething() thực hiện nhiệm vụ tốn thời gian, thì GUI sẽ đóng băng trong trường hợp của DispatcherTimer. Trong trường hợp của bộ hẹn giờ nó sẽ không kể từ khi methos dài được thực hiện trong một chủ đề khác nhau

+0

Tham chiếu đẹp. – Hamed

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