ASP.NET Core 7项目启动的时候自动启动 十个定时任务 ( 每个的周期不一样 优先级也不一样 )不影响主线程的http请求
时间: 2024-04-13 13:31:02 浏览: 101
要在ASP.NET Core 7项目启动时自动启动十个定时任务,并且每个任务的周期和优先级都不同,同时不影响主线程的HTTP请求,您可以使用`System.Threading.Tasks.Task`和`System.Threading.Timer`结合起来执行这些定时任务。
下面是一个示例代码:
```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; // 任务编号
int interval = (i + 1) * 1000; // 每个任务的周期不同
int priority = 10 - i; // 每个任务的优先级不同
Timer timer = new Timer(async (_) =>
{
await Task.Delay(0); // 等待异步方法在后台线程上执行
await DoWork(taskId); // 在后台线程上执行定时任务
}, null, TimeSpan.Zero, TimeSpan.FromMilliseconds(interval));
_timers.Add(timer);
}
return Task.CompletedTask;
}
private async Task DoWork(int taskId)
{
// 执行定时任务的逻辑
// 使用taskId来区分不同的任务
await Task.Delay(100); // 模拟任务执行时间
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(0)`来等待异步方法在后台线程上执行,并使用`Task.Run`在后台线程上执行定时任务的逻辑。
请注意,在`ConfigureServices`方法中注册`MyTimedService`时仍然使用`AddSingleton`方法。
```csharp
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
// 省略其他代码...
services.AddSingleton<MyTimedService>();
// 省略其他代码...
}
```
通过这种方式,您可以在ASP.NET Core 7项目启动时自动启动十个定时任务,并且每个任务的周期和优先级都不同,同时不影响主线程的HTTP请求。
阅读全文