ASP.NET Core 7项目启动的时候自动启动 十个不同的定时任务 每隔200ms执行一次 对主线程造成影响
时间: 2024-04-12 10:31:01 浏览: 149
在ASP.NET Core 7项目中,如果您希望在启动时自动启动十个不同的定时任务,并且每个任务都每隔200ms执行一次,但又不想对主线程造成影响,您可以将任务的执行逻辑放在异步方法中,并使用`Task.Run`来运行这些异步方法。这样可以将任务的执行放在后台线程,避免对主线程造成阻塞。下面是修改后的示例代码:
```csharp
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;
public class MyTimedService : IHostedService, IDisposable
{
private CancellationTokenSource _cancellationTokenSource;
private int _interval = 200; // 定时任务执行的间隔时间(以毫秒为单位)
private int _numTasks = 10; // 定时任务的数量
public Task StartAsync(CancellationToken cancellationToken)
{
_cancellationTokenSource = new CancellationTokenSource();
for (int i = 0; i < _numTasks; i++)
{
int taskId = i; // 避免循环变量在闭包中引起的问题
Task.Run(async () => await DoWork(taskId, _cancellationTokenSource.Token));
}
return Task.CompletedTask;
}
private async Task DoWork(int taskId, CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
// 执行定时任务的逻辑
// 每隔200ms执行一次,taskId表示任务的编号
await Task.Delay(_interval);
}
}
public async Task StopAsync(CancellationToken cancellationToken)
{
_cancellationTokenSource.Cancel();
await Task.CompletedTask;
}
public void Dispose()
{
_cancellationTokenSource.Dispose();
}
}
```
在此示例中,我们使用`Task.Run`将任务的执行逻辑放在后台线程中,每个任务都在一个独立的异步方法`DoWork`中执行。这样可以避免对主线程造成阻塞。同时,我们使用`CancellationToken`来控制任务的取消。
请注意,在`ConfigureServices`方法中注册`MyTimedService`时仍然使用`AddSingleton`方法。
```csharp
using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
// 省略其他代码...
services.AddSingleton<MyTimedService>();
// 省略其他代码...
}
```
通过这种方式,您可以在ASP.NET Core 7项目启动时自动启动十个不同的定时任务,每个任务每隔200ms执行一次,同时避免对主线程造成影响。
阅读全文