The next generation of the Teknik Services. Written in ASP.NET.
https://www.teknik.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.0 KiB
38 lines
1.0 KiB
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; |
|
} |
|
} |
|
}
|
|
|