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