如何在C#中创建Timer?

时间:2018-03-17 13:39:03

标签: c# wpf

如何创建计时器?

对于我的项目,我必须创建一个倒计时器,但是

Task.Delay();
System.Threating.Threat.Sleep();

不起作用,因为它会停止整个应用程序,我需要它保持响应,我的计时器在视觉上减少。 Timer似乎也不起作用,因为当我使用Jignesh Thakker中的Example时,我得到一个错误,即命名空间“Forms”不存在。

定时器代码

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();

t.Interval = 15000; // specify interval time as you want
t.Tick += new EventHandler(timer_Tick);
t.Start();

void timer_Tick(object sender, EventArgs e)
{
    //Call method
}

3 个答案:

答案 0 :(得分:2)

使用DispatcherTimer:

using System.Windows.Threading;
...

var t = new DispatcherTimer();

t.Interval = TimeSpan.FromSeconds(15);
t.Tick += timer_Tick;
t.Start();

void timer_Tick(object sender, EventArgs e)
{
}

答案 1 :(得分:2)

.NET中有超过六十个Timer类。有些是针对特定的环境(如WebDevelopment)。并且大多数情况与计数完成的位置(UI或工作线程)不同,因此它们具有"节拍器质量"并且引发了Tick事件的位置(UI线程或工作线程),因此如果您要处理Invocation并且它们的处理可以被繁忙的UI线程延迟。

System.Windows.Forms.Timer是专门为Windows窗体和其中一个更简单的窗体设计的。顾名思义,它是与Windows窗体相关的.DLL和命名空间的一部分。在使用WPF时,默认情况下没有那些可用(但可以添加它们)。

WPF的主要计时器是Dispatcher Timer,它的工作方式与WindowsForms非常相似(在UI线程上计数和Tick Raise)。请参阅Clemens答案或其示例。

Task.Delay和Thread.Sleep不是每个人说的计时器。他们分别处理为多任务或多线程方法添加延迟。但是如果你没有多任务处理或-Threading,你最终只能阻止你的主线程。 Gusman所写的内容是将Multitasking添加到整个事物中。然而,多任务处理是一个棘手的领域,你可能尚未做好准备。虽然它们非常重要,但tehy不是初学者的主题。你现在应该留在计时器上。

答案 2 :(得分:-1)

如果你使用 System.Timers.Timer ,那么这是一个例子

System.Timers.Timer t = new System.Timers.Timer();
t.Elapsed += new ElapsedEventHandler(Work);
t.Interval = 10;
t.Enabled = true;

private void Work(object sender, ElapsedEventArgs e)
{
    //[Thread safety]
    if (!Dispatcher.CheckAccess())
    {
        Dispatcher.BeginInvoke((ElapsedEventHandler)Work, sender, e);
        return;
    }

    Task task = Task.Run(() =>
    {
        // Your non UI work

        Dispatcher.BeginInvoke((Action)delegate ()
        {
            // Your UI work
        });
    });
}