mirror of
https://git.teknik.io/Teknikode/Teknik.git
synced 2023-08-02 14:16:22 +02:00
39 lines
1.0 KiB
C#
39 lines
1.0 KiB
C#
|
using System;
|
|||
|
using System.Collections.Concurrent;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
using System.Threading;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace Teknik.Utilities
|
|||
|
{
|
|||
|
public class BackgroundTaskQueue : IBackgroundTaskQueue
|
|||
|
{
|
|||
|
private ConcurrentQueue<Func<CancellationToken, Task>> _workItems =
|
|||
|
new ConcurrentQueue<Func<CancellationToken, Task>>();
|
|||
|
|
|||
|
private SemaphoreSlim _signal = new SemaphoreSlim(0);
|
|||
|
|
|||
|
public void QueueBackgroundWorkItem(
|
|||
|
Func<CancellationToken, Task> workItem)
|
|||
|
{
|
|||
|
if (workItem == null)
|
|||
|
{
|
|||
|
throw new ArgumentNullException(nameof(workItem));
|
|||
|
}
|
|||
|
|
|||
|
_workItems.Enqueue(workItem);
|
|||
|
_signal.Release();
|
|||
|
}
|
|||
|
|
|||
|
public async Task<Func<CancellationToken, Task>> DequeueAsync(
|
|||
|
CancellationToken cancellationToken)
|
|||
|
{
|
|||
|
await _signal.WaitAsync(cancellationToken);
|
|||
|
_workItems.TryDequeue(out var workItem);
|
|||
|
|
|||
|
return workItem;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|