using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Serein.Library.Utils { /// /// 消息防抖 /// public static class DebounceHelper { private static readonly ConcurrentDictionary _lastExecutionTimes = new ConcurrentDictionary(); private static readonly object _lockObject = new object(); /// /// 检查是否可以执行操作,根据传入的 key 和 debounceTime 来决定是否允许执行 /// /// 操作的唯一标识 /// 防抖时间,单位为毫秒 /// 如果可以执行操作,返回 true;否则返回 false public static bool CanExecute(string key, int debounceTimeInMs) { lock (_lockObject) { var currentTime = DateTime.Now; if (_lastExecutionTimes.TryGetValue(key, out DateTime lastExecutionTime)) { var timeSinceLastExecution = (currentTime - lastExecutionTime).TotalMilliseconds; if (timeSinceLastExecution < debounceTimeInMs) { // 如果距离上次执行时间小于防抖时间,不允许执行 return false; } } // 更新上次执行时间 _lastExecutionTimes[key] = currentTime; return true; } } } }