c# - 如何停止在 5 秒内多次调用方法?
问题描述
我有这个方法:
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;
解决方案
在我们的项目中,我们为此创建了一个“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();
});
推荐阅读
- sql - SQL 问题 - 为什么我不能解决问题
- java - 如何使我的应用程序可以从任何其他应用程序(例如 Google 翻译应用程序)访问?
- java - IntelliJ Ultimate 中用于 Android 开发的 Java 开发工具包
- c# - 无法使用 autofac 解决通用存储库的依赖关系
- flutter - 使用权限获取当前位置不起作用
- android-studio - 卡在初始化 ADB - Android Studio
- assembly - 如何通过 Opcodes 判断是否需要 ModR/M?
- python-3.x - interpolate.interp1d 线性图与函数的新输入不一致
- php - Wordpress 二十七主题 header.php 文件数据被自动删除
- java - Firebase - 在for循环中同步获取firebase数据?