27 lines
930 B
C#
27 lines
930 B
C#
|
|
using System.Collections.Concurrent;
|
|||
|
|
|
|||
|
|
namespace BMA.EHR.Insignia.Service.Services
|
|||
|
|
{
|
|||
|
|
public class BackgroundTaskQueue : IBackgroundTaskQueue
|
|||
|
|
{
|
|||
|
|
private readonly ConcurrentQueue<Func<CancellationToken, ValueTask>> _workItems = new();
|
|||
|
|
private readonly SemaphoreSlim _signal = new(0);
|
|||
|
|
|
|||
|
|
public ValueTask QueueBackgroundWorkItemAsync(Func<CancellationToken, ValueTask> workItem)
|
|||
|
|
{
|
|||
|
|
if (workItem == null)
|
|||
|
|
throw new ArgumentNullException(nameof(workItem));
|
|||
|
|
_workItems.Enqueue(workItem);
|
|||
|
|
_signal.Release();
|
|||
|
|
return ValueTask.CompletedTask;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public async ValueTask<Func<CancellationToken, ValueTask>> DequeueAsync(CancellationToken cancellationToken)
|
|||
|
|
{
|
|||
|
|
await _signal.WaitAsync(cancellationToken);
|
|||
|
|
_workItems.TryDequeue(out var workItem);
|
|||
|
|
return workItem!;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|