« Background task » : différence entre les versions
Apparence
Page créée avec « = Links = * [https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?tabs=visual-studio Background tasks with hosted services in ASP.NET Core] = Description = In ASP.NET Core, background tasks can be implemented as hosted services. = [https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?tabs=visual-studio#consuming-a-scoped-service-in-a-background-task Consuming a scoped service in a background task] = <filebox... » |
|||
(10 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 11 : | Ligne 11 : | ||
protected override async Task ExecuteAsync(CancellationToken stoppingToken) | protected override async Task ExecuteAsync(CancellationToken stoppingToken) | ||
{ | { | ||
using | using var scope = services.CreateScope(); | ||
var scopedService = scope.ServiceProvider.GetRequiredService<IMyScopedService>(); | |||
await scopedService.DoWork(stoppingToken); | |||
} | } | ||
Ligne 23 : | Ligne 21 : | ||
} | } | ||
} | } | ||
</filebox> | |||
<filebox fn='Program.cs'> | |||
builder.Services.AddHostedService<MyBackgroundService>(); | |||
builder.Services.AddScoped<IMyScopedService, MyScopedService>(); | |||
</filebox> | |||
= [https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?tabs=visual-studio#queued-background-tasks Queued background tasks] = | |||
<filebox fn='ItemQueue'> | |||
public class ItemQueue<T> : IItemQueue | |||
{ | |||
private readonly ConcurrentQueue<T> queue = new(); | |||
public void Enqueue(T item) => queue.Enqueue(item); | |||
public bool TryDequeue(out T item) => queue.TryDequeue(out item); | |||
} | |||
public interface IItemQueue<T> | |||
{ | |||
void Enqueue(T item); | |||
bool TryDequeue(out T item); | |||
} | |||
</filebox> | |||
<filebox fn='QueuedHostedService.cs'> | |||
public class QueuedHostedService(IItemQueue itemQueue) : BackgroundService | |||
{ | |||
public IItemQueue ItemQueue { get; } = itemQueue; | |||
protected override async Task ExecuteAsync(CancellationToken stoppingToken) | |||
{ | |||
while (!stoppingToken.IsCancellationRequested) | |||
{ | |||
await Task.Delay(1000, stoppingToken); | |||
if (ItemQueue.TryDequeueAsync(out var item)) | |||
{ | |||
await DoAsync(item); | |||
} | |||
} | |||
} | |||
} | |||
</filebox> | |||
<filebox fn='Program.cs'> | |||
services.AddHostedService<QueuedHostedService>(); | |||
services.AddSingleton<IItemQueue<MyItem>, ItemQueue<MyItem>>(); | |||
</filebox> | </filebox> | ||
= [https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?tabs=visual-studio#timed-background-tasks Timed background tasks] = | = [https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?tabs=visual-studio#timed-background-tasks Timed background tasks] = |
Dernière version du 18 septembre 2024 à 12:15
Links
Description
In ASP.NET Core, background tasks can be implemented as hosted services.
Consuming a scoped service in a background task
MyBackgroundService.cs |
public class MyBackgroundService(IServiceProvider services) : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
using var scope = services.CreateScope();
var scopedService = scope.ServiceProvider.GetRequiredService<IMyScopedService>();
await scopedService.DoWork(stoppingToken);
}
public override async Task StopAsync(CancellationToken stoppingToken)
{
await base.StopAsync(stoppingToken);
}
}
|
Program.cs |
builder.Services.AddHostedService<MyBackgroundService>();
builder.Services.AddScoped<IMyScopedService, MyScopedService>();
|
Queued background tasks
ItemQueue |
public class ItemQueue<T> : IItemQueue
{
private readonly ConcurrentQueue<T> queue = new();
public void Enqueue(T item) => queue.Enqueue(item);
public bool TryDequeue(out T item) => queue.TryDequeue(out item);
}
public interface IItemQueue<T>
{
void Enqueue(T item);
bool TryDequeue(out T item);
}
|
QueuedHostedService.cs |
public class QueuedHostedService(IItemQueue itemQueue) : BackgroundService
{
public IItemQueue ItemQueue { get; } = itemQueue;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
await Task.Delay(1000, stoppingToken);
if (ItemQueue.TryDequeueAsync(out var item))
{
await DoAsync(item);
}
}
}
}
|
Program.cs |
services.AddHostedService<QueuedHostedService>();
services.AddSingleton<IItemQueue<MyItem>, ItemQueue<MyItem>>();
|