LenovoLegionToolkit
43 строки · 1.1 Кб
1using System;2using System.Threading;3using System.Threading.Tasks;4
5namespace LenovoLegionToolkit.Lib.Utils;6
7public class ThrottleLastDispatcher8{
9private readonly TimeSpan _interval;10private readonly string? _tag;11
12private CancellationTokenSource? _cancellationTokenSource;13
14public ThrottleLastDispatcher(TimeSpan interval, string? tag = null)15{16_interval = interval;17_tag = tag;18}19
20public async Task DispatchAsync(Func<Task> task)21{22try23{24_cancellationTokenSource?.Cancel();25_cancellationTokenSource = new();26
27var token = _cancellationTokenSource.Token;28
29await Task.Delay(_interval, token).ConfigureAwait(false);30token.ThrowIfCancellationRequested();31
32if (_tag is not null && Log.Instance.IsTraceEnabled)33Log.Instance.Trace($"Allowing... [tag={_tag}]");34
35await task().ConfigureAwait(false);36}37catch (OperationCanceledException)38{39if (_tag is not null && Log.Instance.IsTraceEnabled)40Log.Instance.Trace($"Throttling... [tag={_tag}]");41}42}43}
44