1234567891011121314151617181920212223242526272829303132333435363738 |
- 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;
- }
- }
- }
|