C#通过系统时间 在8:00AM 和 8:00PM 两个时间段执行一次任务
时间: 2024-09-23 13:10:29 浏览: 34
在C#中,你可以利用Timer类或者Task Scheduler来设置定时任务。如果你想让一个任务每天8点整和20点整各执行一次,可以这样做:
1. **使用System.Timers.Timer**:
```csharp
using System;
using System.Timers;
class Program
{
private static Timer timer;
public static void Main()
{
// 创建一个定时器,间隔24小时(60 * 60 * 1000毫秒)
timer = new Timer(60 * 60 * 1000);
timer.Elapsed += OnTick; // 定义事件处理程序
// 设置开始时间和结束时间
var startUtc = DateTimeOffset.UtcNow.AddDays(-1).AddHours(8); // 上午8点
var endUtc = DateTimeOffset.UtcNow.AddDays(-1).AddHours(20); // 下午8点
// 如果当前时间在这两个时间段内,启动定时器
if (startUtc <= DateTimeOffset.UtcNow && DateTimeOffset.UtcNow <= endUtc)
{
timer.Start();
}
else
{
Console.WriteLine("定时任务不在指定的时间段内");
}
Console.ReadLine(); // 程序暂停等待用户按下Enter键
}
private static void OnTick(object sender, ElapsedEventArgs e)
{
ExecuteYourTask(); // 这里替换为实际的任务执行代码
}
}
```
2. **使用System.Threading.Tasks.TaskScheduler**:
```csharp
using System;
using System.Threading.Tasks;
class Program
{
private static readonly TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
public static async Task Main()
{
var startUtc = DateTimeOffset.UtcNow.AddDays(-1).AddHours(8);
var endUtc = DateTimeOffset.UtcNow.AddDays(-1).AddHours(20);
while (true)
{
DateTime now = DateTimeOffset.UtcNow.UtcDateTime;
if (startUtc <= now && now <= endUtc)
{
await ScheduleTask(startUtc.AddMinutes(15)); // 调用延迟15分钟的任务
break; // 如果在一天内的任务时间内,跳出循环
}
await Task.Delay(1000); // 每秒检查一次时间
}
}
private static async Task ScheduleTask(DateTime timeToExecute)
{
var task = Task.Run(() => ExecuteYourTask(timeToExecute));
await scheduler.ScheduleAsync(task);
}
private static void ExecuteYourTask(DateTime time)
{
Console.WriteLine($"Task executed at: {time}");
// 替换为实际的任务代码
}
}
```
记得替换`ExecuteYourTask`为你的实际任务代码。这两个例子都假设任务需要在指定时间后立即执行。如果需要精确到分钟,那么你需要调整计算延迟的方式。