C# system.Threading.Timer和system.Timers中的定时器

发布时间 2023-07-30 09:37:38作者: JohnYang819

它们都可以用于在指定时间间隔后执行代码。然而,它们在实现和用法上有一些差异。
System.Threading.Timer:
System.Threading.Timer 是基于线程的定时器,它属于 System.Threading 命名空间。它使用 ThreadPool 线程来执行定时操作。以下是关于 System.Threading.Timer 的一些重要特点:

构造函数:Timer(TimerCallback callback, object state, int dueTime, int period)
TimerCallback 是一个委托,它指向要定时执行的方法。state 是传递给回调方法的对象参数。
dueTime 表示创建定时器后首次执行回调方法的延迟时间(以毫秒为单位)。
period 表示回调方法的执行间隔(以毫秒为单位)。如果将其设置为 0,它只会在 dueTime 后执行一次。
示例:

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        TimerCallback callback = DoSomething;
        Timer timer = new Timer(callback, null, 0, 1000);

        Console.WriteLine("Press any key to stop the timer.");
        Console.ReadKey();

        // Dispose the timer to stop it properly.
        timer.Dispose();
    }

    static void DoSomething(object state)
    {
        Console.WriteLine("Doing something...");
    }
}

System.Timers.Timer:
System.Timers.Timer 是基于事件的定时器,它属于 System.Timers 命名空间。它使用基于底层计时器的实现,而不是线程池线程。以下是关于 System.Timers.Timer 的一些重要特点:

构造函数:Timer(double interval)
interval 表示定时器的执行间隔(以毫秒为单位)。
示例:

using System;
using System.Timers;

class Program
{
    static void Main()
    {
        Timer timer = new Timer(1000); // 1 second interval
        timer.Elapsed += Timer_Elapsed;
        timer.Start();

        Console.WriteLine("Press any key to stop the timer.");
        Console.ReadKey();

        timer.Stop();
        timer.Dispose();
    }

    private static void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine("Doing something...");
    }
}

2 / 2

在 C# 中,有两种常用的定时器类,分别是 System.Threading.Timer 和 System.Timers.Timer,它们都可以用于在指定时间间隔后执行代码。然而,它们在实现和用法上有一些差异。

System.Threading.Timer:
System.Threading.Timer 是基于线程的定时器,它属于 System.Threading 命名空间。它使用 ThreadPool 线程来执行定时操作。以下是关于 System.Threading.Timer 的一些重要特点:

构造函数:Timer(TimerCallback callback, object state, int dueTime, int period)
TimerCallback 是一个委托,它指向要定时执行的方法。state 是传递给回调方法的对象参数。
dueTime 表示创建定时器后首次执行回调方法的延迟时间(以毫秒为单位)。
period 表示回调方法的执行间隔(以毫秒为单位)。如果将其设置为 0,它只会在 dueTime 后执行一次。
示例:

csharp
Copy code
using System;
using System.Threading;

class Program
{
static void Main()
{
TimerCallback callback = DoSomething;
Timer timer = new Timer(callback, null, 0, 1000);

    Console.WriteLine("Press any key to stop the timer.");
    Console.ReadKey();

    // Dispose the timer to stop it properly.
    timer.Dispose();
}

static void DoSomething(object state)
{
    Console.WriteLine("Doing something...");
}

}
System.Timers.Timer:
System.Timers.Timer 是基于事件的定时器,它属于 System.Timers 命名空间。它使用基于底层计时器的实现,而不是线程池线程。以下是关于 System.Timers.Timer 的一些重要特点:

构造函数:Timer(double interval)
interval 表示定时器的执行间隔(以毫秒为单位)。
示例:

csharp
Copy code
using System;
using System.Timers;

class Program
{
static void Main()
{
Timer timer = new Timer(1000); // 1 second interval
timer.Elapsed += Timer_Elapsed;
timer.Start();

    Console.WriteLine("Press any key to stop the timer.");
    Console.ReadKey();

    timer.Stop();
    timer.Dispose();
}

private static void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("Doing something...");
}

}
差异总结:

实现方式:

System.Threading.Timer 使用 ThreadPool 线程执行定时操作。
System.Timers.Timer 使用基于底层计时器的实现。
精度:

System.Threading.Timer 相对精确,但受到线程池的限制,可能会有轻微的延迟。
System.Timers.Timer 提供更高的精确度。
回调方法:

System.Threading.Timer 使用 TimerCallback 委托来执行回调方法。
System.Timers.Timer 使用事件模型(Elapsed 事件)来执行回调方法。
线程安全性:

System.Threading.Timer 需要开发人员自行处理可能出现的线程同步问题。
System.Timers.Timer 本身是线程安全的,因为它使用了基于事件的模型。
根据需要选择合适的定时器类,如果需要更高的精确度和线程安全性,可以优先考虑 System.Timers.Timer。但请注意,当执行回调方法较为复杂或耗时时,任何定时器都可能受到回调方法本身执行时间的影响,所以在选择定时器时,也要结合实际场景进行评估。