C# event debounce

后端 未结 14 1085
南旧
南旧 2020-11-28 06:22

I\'m listening to a hardware event message, but I need to debounce it to avoid too many queries.

This is an hardware event that sends the machine status and I have t

14条回答
  •  -上瘾入骨i
    2020-11-28 06:53

    I came up with this in my class definition.

    I wanted to run my action immediately if there hasn't been any action for the time period (3 seconds in the example).

    If something has happened in the last three seconds, I want to send the last thing that happened within that time.

        private Task _debounceTask = Task.CompletedTask;
        private volatile Action _debounceAction;
    
        /// 
        /// Debounces anything passed through this 
        /// function to happen at most every three seconds
        /// 
        /// An action to run
        private async void DebounceAction(Action act)
        {
            _debounceAction = act;
            await _debounceTask;
    
            if (_debounceAction == act)
            {
                _debounceTask = Task.Delay(3000);
                act();
            }
        }
    

    So, if I have subdivide my clock into every quarter of a second

      TIME:  1e&a2e&a3e&a4e&a5e&a6e&a7e&a8e&a9e&a0e&a
      EVENT:  A         B    C   D  E              F  
    OBSERVED: A           B           E            F
    

    Note that no attempt is made to cancel the task early, so it's possible for actions to pile up for 3 seconds before eventually being available for garbage collection.

提交回复
热议问题