31 lines
832 B
C#
31 lines
832 B
C#
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Threading;
|
|
|
|
namespace AnotherReplayReader.Utils
|
|
{
|
|
internal class TaskQueue
|
|
{
|
|
private readonly object _lock = new();
|
|
private readonly Dispatcher _dispatcher;
|
|
private Task _current = Task.CompletedTask;
|
|
|
|
public TaskQueue(Dispatcher dispatcher)
|
|
{
|
|
_dispatcher = dispatcher;
|
|
}
|
|
|
|
public Task Enqueue(Func<Task> getTask, CancellationToken cancelToken)
|
|
{
|
|
using var locker = new Lock(_lock);
|
|
_current = _current.ContinueWith(async t =>
|
|
{
|
|
await _dispatcher.InvokeAsync(getTask, DispatcherPriority.Background, cancelToken);
|
|
}, cancelToken);
|
|
return _current.IgnoreCancel();
|
|
}
|
|
|
|
}
|
|
}
|