c# - 防止事件多次重复执行
问题描述
我有一个 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
。
推荐阅读
- javascript - React-Native for-loop 通过大尺寸数组性能问题
- node.js - 日期格式未在 Ejs 中显示,因为它在后端 moment.js 中
- apache-spark - 文件系统应该提供哪些接口才能使其受到 Spark 的支持?
- java - Tomcat-8.0.32 无法在 Mac 上运行
- ruby-on-rails - Where does Rails include modules in a class from lib?
- javascript - 带有操作系统检测的自动下载
- javascript - toString 方法应返回正确的层次结构(无回复)
- kaleido - 无法使用 kaleido 发送带有元掩码的 ETH
- javascript - 按顺序执行单击处理程序,仅在执行操作后呈现元素
- python - 如何从 AWS KMS 将密钥导入 AWS Lambda?