【问题标题】:How can I stop a method being called more than once in 5 seconds?如何停止在 5 秒内多次调用方法?
【发布时间】:2020-10-20 16:43:06
【问题描述】:

我有这个方法:

    public static async Task OpenPageAsync(string route)
    {
        await Shell.Current.GoToAsync(route, true);
    }

如果该方法在 5 秒内被多次调用,我希望忽略第二次调用。有没有人遇到过处理这种需求的方法?

请注意,如果有帮助,我确实可以像这样在应用程序级别创建属性。

public partial class App : Application
{
    public static int LastTapTime;
    public static int TapTime;

【问题讨论】:

标签: c#


【解决方案1】:

在我们的项目中,我们为此创建了一个“MaxFrequencyUpdater”。 唯一的区别:如果在 5 秒内有新的呼叫进来,它会延迟并在 5 秒间隔后执行。

namespace Utils
{
    public class MaxFrequencyUpdater
    {
        private readonly WinformsExceptionHandler _exceptionHandler;

        private readonly string _name;
        private readonly int _millis;
        private MethodInvoker _currentMethod;
        private DateTime _lastExecuted = DateTime.MinValue;
        private readonly object _updaterLockObject = new object();

        public MaxFrequencyUpdater(string name, int maxFrequencyInMillis, WinformsExceptionHandler exceptionHandler)
        {
            _name = name;
            _exceptionHandler = exceptionHandler;
            _millis = maxFrequencyInMillis;
        }
        
        public void Update(MethodInvoker method)
        {
            lock (_updaterLockObject)
            {
                _currentMethod = method;
            }
            Task.Run(HandleWork);
        }

        private void HandleWork()
        {
            lock (_updaterLockObject)
            {
                // No longer bother, someone else handled it already
                if (_currentMethod == null) return;

                var now = DateTime.Now;
                var delay = (int)(_millis - now.Subtract(_lastExecuted).TotalMilliseconds);

                // Post-pone if too soon
                if (delay > 0)
                {
                    Task.Delay(delay).ContinueWith(HandleWork);
                }
                else
                {
                    try
                    {
                        _currentMethod.Invoke();
                    }
                    catch (Exception e)
                    {
                        _exceptionHandler.HandleException(e);
                    }

                    _lastExecuted = now;
                    _currentMethod = null;
                }
            }
        }
    }
}

用法:

_maxFrequencyUpdater.Update(() =>
        {
            doSomething();
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2020-01-09
    • 2013-10-20
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多