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);
}
}
}
}