2

一段时间以来,我一直在努力寻找解决这个问题的方法。编写摆动事件缓冲区的最佳实践是什么?这个想法是当从鼠标手势触发动作时,例如'mouseMoved',因为事件可能被触发多次,我只想触发最后一次调用 - 例如,

如果在执行第一个单击侦听器时单击了五次鼠标,并且有四个已排队,则下一个调用将是第五个调用-将跳过所有先前的调用。

看来我应该使用Executor类,因为它可以删除未提交的任务,但我仍然不太确定。感谢所有帮助!

4

1 回答 1

2

user1291492 是对的,这根本不应该发生。您永远不应该在事件处理程序中运行任何可能需要超过几毫秒才能完成的代码。SwingWorker 文档包含有关如何执行此操作的示例和说明。最重要的报价是

不应在事件调度线程上运行耗时的任务。否则应用程序变得无响应。

为了解决最初的问题,我通常采用两种模式:

  1. 使用标志来标记应该在未来某个时间点执行的操作。当一段时间没有其他工作时,我检查所有标志,重置它们并执行适当的操作。

  2. 在为工作线程安排工作时,请持有对它的引用。每次在安排新工作之前,取消之前安排的工作。最常与 C#/Async 中的 CancellationTokens 一起使用。

于 2012-05-02T15:49:58.543 回答