การเปรียบเทียบตัวจับเวลากับ DispatcherTimer


98

ความแตกต่างคืออะไรbetween System.Windows.Forms.Timer()และSystem.Windows.Threading.DispatcherTimer()? เราควรใช้ในกรณีใด แนวทางปฏิบัติที่ดีที่สุด?

คำตอบ:


111

Windows.Forms.Timerใช้หน้าต่างข้อความวนรอบเพื่อประมวลผลเหตุการณ์ตัวจับเวลา ควรใช้เมื่อเขียนเหตุการณ์เวลาที่ใช้ในแอปพลิเคชัน Windows Forms และคุณต้องการให้ตัวจับเวลาเริ่มทำงานบนเธรด UI หลัก

DispatcherTimerคือกลไกการจับเวลา WPF ควรใช้เมื่อคุณต้องการจัดการเวลาในลักษณะที่คล้ายกัน (แม้ว่าจะไม่ จำกัด เฉพาะเธรดเดียว - แต่ละเธรดมีตัวเลือกจ่ายงานของตัวเอง) และคุณกำลังใช้ WPF เหตุการณ์จะเริ่มทำงานในเธรดเดียวกับ Dispatcher

โดยทั่วไปWPF == DispatcherTimerและWindows Forms == Forms.Timer.

ที่ถูกกล่าวว่านอกจากนี้ยังมีSystem.Threading.Timerซึ่งเป็นตัวจับเวลาclassที่ยิงบนเธรดแยกต่างหาก นี่เป็นสิ่งที่ดีสำหรับการกำหนดเวลาที่เป็นตัวเลขล้วนๆโดยที่คุณไม่ได้พยายามอัปเดต UI เป็นต้น


1
ขอบคุณสำหรับการตอบกลับที่รวดเร็ว ดังนั้นหมายความว่าเมื่อใดก็ตามที่ฉันต้องการจับเวลาที่เกี่ยวข้องกับ UI ฉันควรใช้ DispatcherTimer และเมื่อฉันต้องการเริ่มจับเวลาซึ่งฉันไม่ต้องการหยุด UL ฉันควรใช้ System.Threading.Timer แยกต่างหาก เกลียว. คำถามที่สองคือถ้าฉันต้องการใช้ DispatcherTimer และฉันต้องการมีตัวจับเวลาที่ไม่ผูกมัดกับ UI ฉันควรเรียกมันในเธรดที่แยกจากกันโดยใช้ System.Threading.Timer หรือ DisptacherTimer
paradisonoir

3
ขึ้นอยู่กับสิ่งที่คุณกำลังพยายามทำ ฉันไม่ค่อยใช้ System.Threading.Timer - ฉันมักจะยึดติดกับ Dispatcher Timer แล้วทำงานของคุณ (ซึ่งเป็นสิ่งที่สามารถบล็อก UI ของคุณ) ในเธรดอื่นโดยใช้บางอย่างเช่น BackgroundWorker จริงๆแล้วตัวจับเวลาไม่ควรปิดกั้น UI ของคุณเว้นแต่คุณจะทำงาน "มากเกินไป" ในตัวจัดการเหตุการณ์
Reed Copsey

ฉันมีปัญหากับ DispatcherTimer ที่กินตัวประมวลผลเมื่อเวลาผ่านไป มีวิธีจัดการที่ดีหรือไม่?
discorax

ตรวจสอบเพื่อดูว่าอะไรที่กินซีพียูเป็นพิเศษ คุณกำลังสร้างตัวจับเวลาจำนวนมาก แต่ยังไม่หยุด?
Reed Copsey

3
ตรวจสอบให้แน่ใจว่าคุณตั้งค่าคุณสมบัติช่วงเวลาอย่างถูกต้อง อย่าทำสิ่งนี้: timer1.Interval = TimeSpan ใหม่ (1000); // "1000" แทนเห็บไม่ใช่มิลลิวินาที! CPU สูงมากจนฉันแก้ไขด้วยสิ่งนี้: timer1.Interval = System.TimeSpan.FromSeconds (1);
Lonnie Best

4

ฉันพบบทความดีๆเกี่ยวกับตัวจับเวลาพร้อมตัวอย่างเล็ก ๆ ที่นี่: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

บทสรุป:

หาก DoSomething () จัดการกับส่วนประกอบ GUI จากนั้นคุณต้องใช้ Timer ด้วย: this.Dispatcher.Invoke ((Action) delegate {// GUI RELATED CODE HERE} เนื่องจากคุณไม่สามารถเข้าถึงการควบคุม GUI จากเธรดอื่นได้โดยตรงด้วย DispatcherTimer ที่คุณทำ ไม่จำเป็นต้องทำเช่นนั้น

หาก DoSomething () ทำงานเป็นงานที่ใช้เวลานาน GUI จะหยุดทำงานในกรณีของ DispatcherTimer ในกรณีของ Timer จะไม่ใช้เนื่องจากมีการดำเนินการ Methos แบบยาวในเธรดอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.