C#タイマーのようなWPFタイマー


177

WPFのC#タイマーコントロールのようなコントロールはどこにありますか?

回答:


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の詳細については、こちらをご覧ください


こんにちは、ディスパッチタイマーを使用しようとしましたが、IntelliSenseでそれを見つけることができません。使用するために追加する必要がある参照がありますか?
ヨハネス

2
私はあなたが間隔を設定する方法が好きです、私の意見ではミリ秒より良いです。
JL。

フォームを閉じるときは、必ずdispatcherTimer.Stop()を呼び出してください。タイマーのWinFormsバージョンはそれを自動的に行います。(これがタイマーをコントロールにする利点です。)そうしないと、メモリリークや他のバグが発生する可能性があります。
Trade-Ideas Philip

7
@JLえ?そのコードを解釈することは不可能です。はるかに良いですvar timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
ジムバルター2017年

12

Dispatcherを使用する場合は、

using System.Windows.Threading;

また、DispatcherTimerを右クリックして[解決]をクリックすると、適切な参照が追加されます。


WindowsBase.dllへの参照を追加する必要があります
ジョージビル

16
私見これはどのコントロールを使用するかという質問には答えませんが、受け入れられた回答にコメントを追加するだけです。
スティーブンケネディ

3
私はこれを2012年に追加しました。本当に開発者として始めたばかりですが、まだポイントを獲得しています。しかし、@ StephenKennedyが指摘したように、これはコメントであるべきです。
Malcor、2016年


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


     }

あなたのコードを説明できますか?コードを投稿しただけでは、他の人はそれを学ばず、Webからコードをコピーして貼り付けます。
ロバート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.