C# 防止事件多次重复执行

C# 防止事件多次重复执行,c#,events,event-handling,C#,Events,Event Handling,我有一个Wacom Epad。最初,我在类构造函数上订阅onPenData事件,在设备断开连接时取消订阅 当用户在Wacom Epad屏幕上多次单击时,它将触发我订阅的onPenData事件 private void onPenData(wgssSTU.IPenData penData) // Process incoming pen data { // Do some stuff } 所以我要做的是实现某种机制,以避免在重复单击时执行onPenData 如何执行此操作?您不能阻止

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

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

private void onPenData(wgssSTU.IPenData penData) // Process incoming pen data
{
     // Do some stuff
} 
所以我要做的是实现某种机制,以避免在重复单击时执行onPenData


如何执行此操作?

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

假设存在事件处理程序
onPenData
OnPenDataBusinessLogic
方法:

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

在后台线程/任务中处理笔数据。您可以尝试设置全局变量,并在执行方法逻辑之前对其进行检查。我不确定你的意思。若你们的意思是在一个时间段内不要开火,那个么假设5秒后你们就可以使用定时器了。你们不知道“Wacom Epad”是什么,但多次开火有什么问题吗?请解释问题的详细信息。@user1624552,如果您的代码允许设置标志,请在订阅事件后添加标志=false,然后在连续多次单击时,如果标志=false,则事件将不会再次订阅bcoz标志值为非真。我想这可能会有帮助you@Dennis它是一种平板电脑,用户可以用笔点击它。所以当用户用钢笔反复点击它,每次点击之间的间隔不到1秒,我的意思是,用户非常快速地点击它,重复了很多次,我的程序因内存不足而崩溃。另一个选项是,如果未超过几秒/毫秒,则在下次触发事件时忽略,如下所述:您发布的选项1不是线程安全的。OnPendateRunning应该使用锁进行保护。