【问题标题】:Prevent event to be executed multiple repeated times防止事件多次重复执行
【发布时间】:2025-05-11 16:10:01
【问题描述】:

我有一个 Wacom Epad。最初,我在类构造函数上订阅 onPenData 事件,并在设备断开连接时取消订阅。

当用户在 Wacom Epad 屏幕上多次点击时,它会触发我订阅的 onPenData 事件。

private void onPenData(wgssSTU.IPenData penData) // Process incoming pen data
{
     // Do some stuff
} 

所以我想做的是实现某种机制来避免 onPenData 在重复点击时被执行。

我该怎么做?

【问题讨论】:

  • 您可以尝试设置一个全局变量被点击并在执行方法逻辑之前检查它。我不确定这就是你的意思。如果你的意思是不要在一个时间段之间开火,比你可以使用计时器说 5 秒。
  • 不知道什么是“Wacom Epad”,但多次触发事件有什么问题?请详细说明问题。
  • @user1624552,如果您的代码允许设置标志,那么请在您的事件订阅后添加标志=false,然后连续多次点击如果标志=false,则事件将不会再次订阅 bcoz 标志值不正确.我想这对你有帮助吗
  • @Dennis 这是一种用户使用笔点击它的平板电脑。因此,当用户使用笔重复点击它时,例如两次点击之间的间隔少于 1 秒,我的意思是,用户非常快速地点击它很多次,我的程序崩溃说内存不足。

标签: c# events event-handling


【解决方案1】:

您无法阻止事件处理程序触发,但您可以管理事件处理逻辑执行。

假设,有事件处理程序onPenDataOnPenDataBusinessLogic 方法:

private void onPenData(wgssSTU.IPenData penData) // Process incoming pen data
{
    OnPenDataBusinessLogic(penData);
} 

private void OnPenDataBusinessLogic(wgssSTU.IPenData penData)
{
     // Do some stuff
}

现在您有多种选择:

1) bool 标志。最简单的一个:

private bool onPenDataRunning;

private void onPenData(wgssSTU.IPenData penData) // Process incoming pen data    
{
    if (onPenDataRunning)
    {
        return;
    }

    onPenDataRunning = true;
    try
    {
        OnPenDataBusinessLogic(penData);
    }
    finally
    {
        onPenDataRunning = false;
    }
} 

2) OnPenDataBusinessLogic 延迟执行。每次onPenData 被触发时,(重新)启动一个计时器。当计时器到时,拨打OnPenDataBusinessLogic

3) 笔数据缓冲。缓存onPenData中的数据,通过OnPenDataBusinessLogic在后台线程/任务中处理笔数据。

【讨论】:

  • 另一个选项是忽略下一次触发事件,如果没有经过几秒/毫秒,如下所述:*.com/questions/841332/…
  • 您发布的选项 1 不是线程安全的。 onPenDataRunning 应该使用锁来保护。
最近更新 更多