首页 > 解决方案 > 防止事件多次重复执行

问题描述

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

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

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

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

我怎样才能做到这一点?

标签: c#eventsevent-handling

解决方案


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

假设有事件处理程序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


推荐阅读