WPF Timer เหมือนกับ C # Timer


177

ฉันจะหาตัวควบคุมที่เหมือนกับตัวควบคุมตัวจับเวลา C # ใน WPF ได้ที่ไหน

คำตอบ:


325

ตัวจับเวลา WPF ปกติคือDispatcherTimerซึ่งไม่ใช่ตัวควบคุม แต่ใช้ในรหัส มันใช้งานได้เช่นเดียวกับตัวจับเวลา WinForms:

System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0,0,1);
dispatcherTimer.Start();


private void dispatcherTimer_Tick(object sender, EventArgs e)
{
  // code goes here
}

เพิ่มเติมเกี่ยวกับ DispatcherTimer สามารถพบได้ที่นี่


สวัสดีฉันพยายามใช้ตัวส่งเวลา แต่ฉันไม่สามารถหาได้ใน intelisense ของฉันมีการอ้างอิงใด ๆ ที่จำเป็นต้องเพิ่มเพื่อให้ฉันใช้หรือไม่
โยฮันเนส

2
ฉันชอบวิธีที่คุณตั้งช่วงเวลาดีกว่าความคิดของฉันเป็นมิลลิวินาที
JL

ให้แน่ใจว่าได้โทร dispatcherTimer.Stop () เมื่อคุณปิดแบบฟอร์มของคุณ ตัวจับเวลาเวอร์ชัน WinForms ทำเช่นนั้นโดยอัตโนมัติ (นั่นคือข้อดีของการทำให้ตัวจับเวลาเป็นตัวควบคุม) ถ้าคุณไม่ทำคุณจะมีหน่วยความจำรั่วและมีข้อบกพร่องอื่น ๆ
แนวคิดการค้าฟิลิป

7
@JL เอ๊ะ? รหัสนั้นเป็นไปไม่ได้ที่จะตีความ สิ่งที่ดีกว่าคือvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

ด้วยโปรแกรมเลือกจ่ายงานคุณจะต้องรวม

using System.Windows.Threading;

โปรดทราบด้วยว่าหากคุณคลิกขวา DispatcherTimer และคลิกแก้ไขควรเพิ่มการอ้างอิงที่เหมาะสม


จำเป็นต้องเพิ่มการอ้างอิงถึง WindowsBase.dll btw
George Birbilis

16
IMHO ไม่ตอบคำถามเกี่ยวกับการควบคุมที่จะใช้เพียงเพิ่มความเห็นให้กับคำตอบที่ยอมรับ
สตีเฟ่นเคนเนดี

3
ฉันเพิ่มสิ่งนี้ในปี 2012 เพิ่งเริ่มต้นในฐานะนักพัฒนาซอฟต์แวร์ฉันยังได้รับคะแนน แต่ตามที่ @StephenKennedy ชี้ว่านี่ควรเป็นความคิดเห็น
Malcor


0

จับเวลามีฟังก์ชั่นพิเศษ

  1. เรียกตัวจับเวลาแบบอะซิงโครนัสหรือตัวจับเวลาแบบซิงโครนัส
  2. เปลี่ยนช่วงเวลา
  3. ความสามารถในการยกเลิกและดำเนินการต่อ  

หากคุณใช้StartAsync ()หรือStart ()เธรดจะไม่บล็อกองค์ประกอบส่วนต่อประสานผู้ใช้

     namespace UITimer


     {
        using thread = System.Threading;
        public class Timer
        {

        public event Action<thread::SynchronizationContext> TaskAsyncTick;
        public event Action Tick;
        public event Action AsyncTick;
        public int Interval { get; set; } = 1;
        private bool canceled = false;
        private bool canceling = false;
        public async void Start()
        {
            while(true)
            {

                if (!canceled)
                {
                    if (!canceling)
                    {
                        await Task.Delay(Interval);
                        Tick.Invoke();
                    }
                }
                else
                {
                    canceled = false;
                    break;
                }
            }


        }
        public void Resume()
        {
            canceling = false;
        }
        public void Cancel()
        {
            canceling = true;
        }
        public async void StartAsyncTask(thread::SynchronizationContext 
        context)
        {

                while (true)
                {
                    if (!canceled)
                    {
                    if (!canceling)
                    {
                        await Task.Delay(Interval).ConfigureAwait(false);

                        TaskAsyncTick.Invoke(context);
                    }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }

        }
        public void StartAsync()
        {
            thread::ThreadPool.QueueUserWorkItem((x) =>
            {
                while (true)
                {

                    if (!canceled)
                    {
                        if (!canceling)
                        {
                            thread::Thread.Sleep(Interval);

                    Application.Current.Dispatcher.Invoke(AsyncTick);
                        }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }
            });
        }

        public void StartAsync(thread::SynchronizationContext context)
        {
            thread::ThreadPool.QueueUserWorkItem((x) =>
            {
                while(true)
                 {

                    if (!canceled)
                    {
                        if (!canceling)
                        {
                            thread::Thread.Sleep(Interval);
                            context.Post((xfail) => { AsyncTick.Invoke(); }, null);
                        }
                    }
                    else
                    {
                        canceled = false;
                        break;
                    }
                }
            });
        }
        public void Abort()
        {
            canceled = true;
        }
    }


     }

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