123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- using Microsoft.Extensions.Hosting;
- using System;
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace TEAMModelOS.Function.DI
- {
- public class BackgroundWorkerQueue
- {
- private readonly ConcurrentQueue<Func<CancellationToken, Task>> _workItems = new();
- private readonly SemaphoreSlim _signal = new(0);
- public async Task<Func<CancellationToken, Task>> DequeueAsync(CancellationToken cancellationToken)
- {
- await _signal.WaitAsync(cancellationToken);
- _workItems.TryDequeue(out var workItem);
- return workItem;
- }
- public void QueueBackgroundWorkItem(Func<CancellationToken, Task> workItem)
- {
- ArgumentNullException.ThrowIfNull(workItem);
- _workItems.Enqueue(workItem);
- _signal.Release();
- }
- }
- public class LongRunningService : BackgroundService
- {
- public LongRunningService(BackgroundWorkerQueue queue)
- {
- _queue = queue;
- }
- private readonly BackgroundWorkerQueue _queue;
- protected override async Task ExecuteAsync(CancellationToken stoppingToken)
- {
- while (!stoppingToken.IsCancellationRequested)
- {
- var workItem = await _queue.DequeueAsync(stoppingToken);
- await workItem(stoppingToken);
- }
- }
- }
- }
|