zoukankan      html  css  js  c++  java
  • C#.Net下的防抖-Debounce和节流阀-Throttle功能实现

    C#下的防抖-Debounce、节流阀-Throttle功能实现

    防抖-Debounce

    连续的多次调用,只有在调用停止之后的一段时间内不再调用,然后才执行一次处理过程。

    节流阀-Throttle

    连续的多次调用,在每个时间段的周期内只执行第一次处理过程。

    代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Timers;
    using System.Threading.Tasks;
    using System.ComponentModel;
    
    namespace HZ.Common
    {
        public class DelayAction
        {
            Timer _timerDbc;
            Timer _timerTrt;
    
            /// <summary>
            /// 延迟timesMs后执行。 在此期间如果再次调用,则重新计时
            /// </summary>
            /// <param name="invoker">同步对象,一般为Control控件。 如不需同步可传null</param>
            public void Debounce(int timeMs, ISynchronizeInvoke invoker, Action action)
            {
                lock (this)
                {
                    if (_timerDbc == null)
                    {
                        _timerDbc = new Timer(timeMs);
                        _timerDbc.AutoReset = false;
                        _timerDbc.Elapsed += (o, e) =>
                        {
                            _timerDbc.Stop();
                            _timerDbc.Close();
                            _timerDbc = null;
                            InvokeAction(action, invoker);
                        };
                    }
                    _timerDbc.Stop();
                    _timerDbc.Start();
                }
            }
    
    
            /// <summary>
            /// 即刻执行,执行之后,在timeMs内再次调用无效
            /// </summary>
            /// <param name="timeMs">不应期,这段时间内调用无效</param>
            /// <param name="invoker">同步对象,一般为控件。 如不需同步可传null</param>
            public void Throttle(int timeMs, ISynchronizeInvoke invoker, Action action)
            {
                System.Threading.Monitor.Enter(this);
                bool needExit = true;
                try
                {
                    if (_timerTrt == null)
                    {
                        _timerTrt = new Timer(timeMs);
                        _timerTrt.AutoReset = false;
                        _timerTrt.Elapsed += (o, e) =>
                        {
                            _timerTrt.Stop();
                            _timerTrt.Close();
                            _timerTrt = null;
                        };
                        _timerTrt.Start();
                        System.Threading.Monitor.Exit(this);
                        needExit = false;
                        InvokeAction(action, invoker);//这个过程不能锁
                    }
                }
                finally
                {
                    if (needExit)
                        System.Threading.Monitor.Exit(this);
                }
            }
    
            /// <summary>
            /// 延迟timesMs后执行。 
            /// </summary>
            public void Delay(int timeMs, ISynchronizeInvoke invoker, Action action)
            {
                Debounce(timeMs, invoker, action);
            }
    
    
            private static void InvokeAction(Action action, ISynchronizeInvoke invoker)
            {
                if (invoker == null)
                {
                    action();
                }
                else
                {
                    if (invoker.InvokeRequired)
                    {
                        invoker.Invoke(action, null);
                    }
                    else
                    {
                        action();
                    }
                }
            }
        }
    }
  • 相关阅读:
    JS实现动态生成表格并提交表格数据向后端 表格中数据转为json
    JS 添加和删除HTML 标签
    操作系统杂碎
    bootstrap3级下拉菜单 及 CSS实现三级下拉菜单分析
    jquery获取复选框被选中的值
    Mac 命令行启动并连接Redis
    抓包工具不抓包的话记得看看还有没有没关的代理
    Mac OS Sierra 安装PHP扩展 Operation not permitted
    导航栏对于UIScrollview以及子类所做的一些事
    探索static的用处
  • 原文地址:https://www.cnblogs.com/hz-blog/p/5961299.html
Copyright © 2011-2022 走看看