using Cysharp.Threading.Tasks; using System; namespace UVC.Util { /// /// 특정 시간 동안 함수 실행을 제한하는 유틸리티 클래스 /// public class Throttle { private DateTime timerStarted = DateTime.UtcNow.AddYears(-1); /// /// 비동기 함수 실행 후 지정된 milliseconds 동안 추가 실행을 모두 취소합니다. /// /// 함수에 전달할 매개변수의 타입 /// 제한 시간(밀리초) /// 실행할 비동기 함수 /// 비동기 함수에 전달할 매개변수 /// /// 아래는 ThrottleUniTask 메소드를 사용하는 예제입니다: /// /// var throttle = new Throttle(); /// await throttle.ThrottleUniTask(1000, async (param) => /// { /// Console.WriteLine($"실행됨: {param}"); /// await UniTask.Delay(500); /// }, "테스트 매개변수"); /// /// public void ThrottleUniTask(int milliseconds, Func action, T param) { if (DateTime.UtcNow - timerStarted > TimeSpan.FromMilliseconds(milliseconds)) { timerStarted = DateTime.UtcNow; action.Invoke(param).Forget(); } } /// /// 동기 함수 실행 후 지정된 milliseconds 동안 추가 실행을 모두 취소합니다. /// /// 함수에 전달할 매개변수의 타입 /// 제한 시간(밀리초) /// 실행할 동기 함수 /// 동기 함수에 전달할 매개변수 /// /// 아래는 ThrottleAction 메소드를 사용하는 예제입니다: /// /// var throttle = new Throttle(); /// throttle.ThrottleAction(1000, (param) => /// { /// Console.WriteLine($"실행됨: {param}"); /// }, "테스트 매개변수"); /// /// public void ThrottleAction(int milliseconds, Action action, T param) { if (DateTime.UtcNow - timerStarted > TimeSpan.FromMilliseconds(milliseconds)) { timerStarted = DateTime.UtcNow; action.Invoke(param); } } } }