ASP.NET Core 7项目启动的时候自动启动 十个定时任务 启动开始时间不一样 不影响主线程的http请求 每个的周期不一样 优先级也不一样
时间: 2024-04-13 10:30:57 浏览: 84
ASP.NET定时任务
4星 · 用户满意度95%
要在ASP.NET Core 7项目启动时自动启动十个定时任务,每个任务的启动时间、周期和优先级都不同,并且不影响主线程的HTTP请求,您可以使用`System.Threading.Timer`结合`Task.Run`来执行这些定时任务。下面是一个示例代码:
```csharp
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
public class MyTimedService : IHostedService, IDisposable
{
private List<Timer> _timers = new List<Timer>();
public Task StartAsync(CancellationToken cancellationToken)
{
var tasks = new List<Task>();
// 创建十个定时任务
for (int i = 0; i < 10; i++)
{
int taskId = i; // 任务编号
TimeSpan startTime = TimeSpan.FromSeconds(i + 1); // 每个任务的启动开始时间不同
int interval = 1000 * (i + 1); // 每个任务的周期不同
int priority = 10 - i; // 每个任务的优先级不同
Timer timer = new Timer(async (_) =>
{
await Task.Delay(startTime); // 等待指定的启动开始时间
await Task.Run(() => DoWork(taskId)); // 在后台线程上执行定时任务
}, null, TimeSpan.Zero, TimeSpan.FromMilliseconds(interval));
_timers.Add(timer);
}
return Task.CompletedTask;
}
private void DoWork(int taskId)
{
// 执行定时任务的逻辑
// 使用taskId来区分不同的任务
Console.WriteLine($"Task {taskId} executed at {DateTime.Now}");
}
public async Task StopAsync(CancellationToken cancellationToken)
{
foreach (var timer in _timers)
{
timer.Dispose();
}
await Task.CompletedTask;
}
public void Dispose()
{
foreach (var timer in _timers)
{
timer.Dispose();
}
}
}
```
在此示例中,我们使用`System.Threading.Timer`来创建定时器,并设置每个任务的启动开始时间、周期和优先级。在定时器的回调方法中,我们使用`Task.Delay`来等待指定的启动开始时间,并使用`Task.Run`在后台线程上执行定时任务的逻辑。
请注意,在`ConfigureServices`方法中注册`MyTimedService`时仍然使用`AddSingleton`方法。
```csharp
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
// 省略其他代码...
services.AddSingleton<MyTimedService>();
// 省略其他代码...
}
```
通过这种方式,您可以在ASP.NET Core 7项目启动时自动启动十个定时任务,并且每个任务的启动时间、周期和优先级都不同,同时不影响主线程的HTTP请求。
阅读全文