using Cysharp.Threading.Tasks; using System; using System.Threading; namespace UVC.Util { public class Debounce : IDisposable { private CancellationTokenSource cts = new CancellationTokenSource(); /// /// 마지막 호출 된 함수 한번 실행. milliseconds 이후 실행 되어 추가로 호추 되면 이전 함수 취소 함. /// Debounce debounce = new Debounce(); /// debounce.DebounceAction(1000, repository.SaveToolBarData, data); /// /// param Type /// /// /// public void DebounceAction(int milliseconds, Action action, T param) { resetCancellationToken(); UniTask.Delay(TimeSpan.FromMilliseconds(milliseconds), cancellationToken: cts.Token, ignoreTimeScale: false).ContinueWith(() => { action.Invoke(param); }); } /// /// 마지막 호출 된 함수 한번 실행. milliseconds 이후 실행 되어 추가로 호추 되면 이전 함수 취소 함. /// Debounce debounce = new Debounce(); /// debounce.DebounceUniTask(1000, repository.SaveToolBarData, data); /// /// param Type /// /// /// public void DebounceUniTask(int milliseconds, Func action, T param) { resetCancellationToken(); UniTask.Delay(TimeSpan.FromMilliseconds(milliseconds), cancellationToken: cts.Token, ignoreTimeScale: false).ContinueWith(() => { action.Invoke(param).Forget(); }); } private void resetCancellationToken() { cts.Cancel(); cts = new CancellationTokenSource(); } public void Dispose() { cts.Cancel(); cts.Dispose(); } } }