在C#的异步编程场景中,定时轮询是很多业务的基础需求,比如定期拉取接口数据、定时检查服务状态等。传统Timer类基于回调机制,在异步场景下容易出现线程上下文切换问题,而.NET 6引入的PeriodicTimer基于异步等待设计,完美适配异步编程模型,是更现代的定时轮询实现方案。

PeriodicTimer核心特性
PeriodicTimer和传统的Timer类有本质区别,它的核心特性如下:
- 基于
ValueTask<bool>的异步等待机制,不需要注册回调方法,避免回调嵌套 - 支持异步取消,通过
CancellationToken可以灵活控制定时任务的停止 - 线程安全,不需要额外处理线程同步问题
- 每次等待完成后需要手动触发下一次等待,不会自动重复执行,避免任务执行时间超过间隔导致的重叠问题
基础使用方式
PeriodicTimer的基础使用流程非常简单,首先创建实例指定轮询间隔,然后通过异步循环等待触发信号即可。下面是基础的使用示例:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// 创建PeriodicTimer,设置轮询间隔为2秒
using PeriodicTimer timer = new PeriodicTimer(TimeSpan.FromSeconds(2));
int pollCount = 0;
// 异步循环等待定时器信号
while (await timer.WaitForNextTickAsync())
{
pollCount++;
Console.WriteLine($"第{pollCount}次定时轮询执行,时间:{DateTime.Now:HH:mm:ss}");
// 模拟轮询业务执行耗时
await Task.Delay(500);
// 如果达到指定轮询次数则退出循环
if (pollCount >= 5)
{
break;
}
}
Console.WriteLine("定时轮询结束");
}
}
支持取消的定时轮询实现
实际业务中经常需要支持手动停止定时轮询,这时候可以结合CancellationToken实现。下面的示例演示了如何通过取消令牌控制定时任务的停止:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using PeriodicTimer timer = new PeriodicTimer(TimeSpan.FromSeconds(3));
using CancellationTokenSource cts = new CancellationTokenSource();
// 5秒后自动触发取消
cts.CancelAfter(TimeSpan.FromSeconds(5));
int count = 0;
try
{
while (await timer.WaitForNextTickAsync(cts.Token))
{
count++;
Console.WriteLine($"第{count}次轮询,时间:{DateTime.Now:HH:mm:ss}");
// 模拟业务执行
await Task.Delay(1000);
}
}
catch (OperationCanceledException)
{
Console.WriteLine("定时轮询被取消");
}
}
}
和传统Timer的对比
为了更直观了解PeriodicTimer的优势,我们将它和传统的System.Threading.Timer做对比:
| 对比项 | PeriodicTimer | System.Threading.Timer |
|---|---|---|
| 异步支持 | 原生支持异步等待,适配async/await | 基于回调,异步场景需要额外处理上下文 |
| 取消机制 | 原生支持CancellationToken | 需要手动调用Dispose或Change方法停止 |
| 任务重叠处理 | 不会自动重复触发,避免重叠 | 默认会重复触发,需要额外加锁避免重叠 |
| 使用复杂度 | 代码逻辑线性,易读性高 | 回调嵌套,复杂场景逻辑分散 |
使用注意事项
使用PeriodicTimer时需要注意以下几点:
- PeriodicTimer实现了
IDisposable接口,使用完成后需要及时释放,避免资源泄漏 WaitForNextTickAsync方法返回false时表示定时器已经被释放,需要退出等待循环- 如果轮询的业务执行时间可能超过设定的间隔,PeriodicTimer不会自动叠加触发,需要开发者根据业务需求调整间隔或者优化业务执行逻辑
- PeriodicTimer仅支持.NET 6及以上版本,低版本框架无法使用
通过上述示例可以看出,PeriodicTimer在异步定时轮询场景下比传统定时器更简洁、更安全,尤其是在需要配合async/await编写异步逻辑时,能大幅降低代码的复杂度,是C#现代异步开发中定时任务的首选方案。
C#PeriodicTimer定时轮询异步定时器修改时间:2026-07-18 08:09:22