【问题标题】:Where is the WPF Timer control?WPF Timer 控件在哪里?
【发布时间】:2011-07-21 14:13:21
【问题描述】:

在哪里可以找到类似于 WPF 中的 C# Timer 控件的控件?

【问题讨论】:

    标签: c# wpf timer


    【解决方案1】:

    通常的 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 的更多信息,请访问here

    【讨论】:

    • 嗨,我一直在尝试使用调度计时器,但我在智能感知中找不到它,是否需要添加任何参考资料供我使用?
    • 我喜欢你设置间隔的方式,在我看来比毫秒更好。
    • 请务必在关闭表单时调用 dispatcherTimer.Stop()。计时器的 WinForms 版本会自动执行此操作。 (这就是将计时器设置为控件的优点。)如果不这样做,您将遇到内存泄漏和其他错误。
    • @JL 嗯?该代码无法解释。更好的是var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
    【解决方案2】:

    使用 Dispatcher,您需要包含

    using System.Windows.Threading;
    

    还请注意,如果您右键单击 DispatcherTimer 并单击 Resolve,它应该添加适当的引用。

    【讨论】:

    • 需要添加对 WindowsBase.dll 的引用
    • 恕我直言,这并没有回答关于使用哪个控件的问题,它只是为接受的答案添加了一些评论。
    • 我在 2012 年添加了这个,刚开始作为开发人员,我仍然可以得到积分。但正如@StephenKennedy 指出的那样,这应该是一条评论。
    【解决方案3】:

    你也可以使用

    using System.Timers;
    using System.Threading;
    

    【讨论】:

      【解决方案4】:

      定时器有特殊功能。

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

      【讨论】:

      • 你能解释一下你的代码吗?如果您只是发布一些代码,人们不会从中学习,而只是从网络上复制和粘贴一些代码。
      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2014-08-08
      • 2010-12-12
      • 2011-09-01
      • 2016-08-03
      • 1970-01-01
      相关资源
      最近更新 更多