WPF Timer Wie C # Timer


177

Wo finde ich ein Steuerelement, das dem C # -Timer-Steuerelement in WPF ähnelt?

Antworten:


324

Der übliche WPF-Timer ist der DispatcherTimer, der kein Steuerelement ist, sondern im Code verwendet wird. Es funktioniert im Grunde genauso wie der WinForms-Timer:

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
}

Mehr zum DispatcherTimer finden Sie hier


Hallo, ich habe versucht, den Versand-Timer zu verwenden, aber ich kann ihn nicht in meinem Intelisense finden. Gibt es eine Referenz, die hinzugefügt werden muss, damit ich ihn verwenden kann?
Yohannes

2
Mir gefällt die Art und Weise, wie Sie das Intervall einstellen, meiner Meinung nach besser als Millisekunden.
JL.

Rufen Sie beim Schließen Ihres Formulars unbedingt dispatcherTimer.Stop () auf. Die WinForms-Version des Timers erledigt dies automatisch. (Dies ist der Vorteil, wenn Sie den Timer zu einem Steuerelement machen.) Wenn Sie dies nicht tun, treten Speicherverluste und möglicherweise andere Fehler auf.
Handelsideen Philip

7
@ JL Eh? Dieser Code ist nicht zu interpretieren. Weitaus besser istvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
Jim Balter

12

Mit Dispatcher müssen Sie einschließen

using System.Windows.Threading;

Beachten Sie außerdem, dass, wenn Sie mit der rechten Maustaste auf DispatcherTimer klicken und auf Auflösen klicken, die entsprechenden Verweise hinzugefügt werden sollten.


Ich muss einen Verweis auf WindowsBase.dll hinzufügen
George Birbilis

16
IMHO beantwortet dies nicht die Frage, welches Steuerelement verwendet werden soll, sondern fügt lediglich einen Kommentar zur akzeptierten Antwort hinzu.
Stephen Kennedy

3
Ich habe dies 2012 hinzugefügt, als ich gerade als Entwickler angefangen habe. Ich bekomme immer noch Punkte dafür. Aber wie @StephenKennedy betonte, sollte dies ein Kommentar sein.
Malcor


0

Der Timer hat spezielle Funktionen.

  1. Rufen Sie einen asynchronen Timer oder einen synchronen Timer auf.
  2. Ändern Sie das Zeitintervall
  3. Möglichkeit zum Abbrechen und Fortsetzen  

Wenn Sie StartAsync ()oder verwenden Start (), blockiert der Thread das Benutzeroberflächenelement nicht

     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;
        }
    }


     }

Können Sie Ihren Code erklären? Wenn Sie nur Code veröffentlichen, lernen die Leute nicht daraus und kopieren und fügen einfach Code aus dem Web ein.
Robert
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.