请选择 进入手机版 | 继续访问电脑版
MSIPO技术圈 首页 IT技术 查看内容

C# 函数防抖

2023-07-13


前言

当我们在编写 GUI 界面或响应用户输入的操作时,经常会遇到一些情况:用户可能会频繁触发某个事件,导致界面或系统反应过于频繁,甚至会引发性能问题。


一、函数防抖是什么

在特定时间段内只响应事件的首次触发,并在这个时间段内忽略后续的事件触发。它通过设定一个时间间隔,在事件触发后启动一个计时器,在计时器结束之前若事件再次触发,则重置计时器。只有当计时器结束后,事件才会被有效处理。

二、相关代码

1.防抖函数类

    /// <summary>
    /// 函数防抖
    /// </summary>
    public class Debounce
    {
        /// <summary>
        /// 函数防抖
        /// </summary>
        /// <param name="callback">回调函数</param>
        /// <param name="dueTime">延迟时间,以毫秒为单位</param>
        public Debounce(Action<object[]> callback, int dueTime)
        {
            this.DueTime = dueTime;
            this.Callback = callback;
            this.Timer = new Timer(ExecuteCallback, null, Timeout.Infinite, Timeout.Infinite);
        }

        /// <summary>
        /// 计时器
        /// </summary>
        protected Timer Timer { get; }

        /// <summary>
        /// 延迟之前调用的回调方法时指定的时间量,以毫秒为单位
        /// </summary>
        protected int DueTime { get; }

        /// <summary>
        /// 回调函数
        /// </summary>
        protected Action<object[]> Callback { get; }

        /// <summary>
        /// 回调函数参数值
        /// </summary>
        private object[] _args;
                
        /// <summary>
        /// 触发函数防抖
        /// </summary>
        /// <param name="args">参数值</param>
        public void Trigger(params object[] args)
        {
            _args = args;// 重置延迟时间
            this.Timer.Change(this.DueTime, Timeout.Infinite);
        }

        /// <summary>
        /// 执行回调函数
        /// </summary>
        /// <param name="state"></param>
        private void ExecuteCallback(object state)
        {
            this.Callback(_args);
        }
    }

2.使用示例

代码如下(示例):

private Debounce debounce;
/// <summary>
/// 
/// </summary>
public void Method1()
{
	debounce = new Debounce(DrawText, 1000);
}

/// <summary>
/// 定时器操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TimerTick(object sender, EventArgs e)
{
	bool isModifiy=true;//假设触发了修改操作
	if(isModifiy)
		debounce.Trigger(para1, para2);
}
/// <summary>
/// 绘制文本
/// </summary>
/// <param name="args"></param>
private void DrawText(params object[] args)
{
	string text = args[0].ToString();
	float size = float.Parse(args[1].ToString());
}


总结

防抖函数的优点

  1. 有效限制了频繁操作的执行次数,减少了不必要的资源消耗。
  2. 在某些场景下,防抖函数可提升用户体验,避免由于操作过快导致的问题。

注意的事项

  1. 延迟时间应根据实际需求进行设置,以平衡触发操作的响应速度和操作执行的频率。
  2. 防抖函数适用于一些不需要立即响应的操作,例如输入框的输入事件、窗口的调整大小等。
  3. 对于需要立即响应的操作,如点击事件等,使用防抖函数可能会导致延迟响应的问题,需谨慎使用。

防抖函数是一种实现限制频繁操作的方法,通过延迟执行最后一次触发的操作,优化资源利用和用户体验。

相关阅读

热门文章

    手机版|MSIPO技术圈 皖ICP备19022944号-2

    Copyright © 2024, msipo.com

    返回顶部