【问题标题】:Detecting idle time in a C# Windows Forms application without Application.Idle在没有 Application.Idle 的 C# Windows 窗体应用程序中检测空闲时间
【发布时间】:2011-03-02 03:22:35
【问题描述】:

我有一个奇怪的问题,我不太确定如何解决或解决。我正在编写一个迷你文本编辑器风格的应用程序 - RichTextBox 编辑器。

选择更改后,我需要进行一些复杂的解析 - 更新位置、选择文本和有关区域周围文本上下文的各种其他位。

由于需要一些处理,如果用户使用箭头键滚动,我不希望每次选择更改时都会触发它。我曾想过使用 Application.Idle,但它触发得太频繁了。我尝试了一个计时器,但它可能会在选择箭头仍在移动时触发。

我想到的是一种倒数计时器类型的实用程序,它会在每次触发 RichTextBox SelectionChanged 事件时重置计时器,然后当计时器达到 500 毫秒或 1000 毫秒时,它将执行复杂的处理运行。

这听起来是个好主意吗?

【问题讨论】:

  • 你什么时候必须做这个处理?选择某些内容时,甚至光标位置仅更改时(SelectionLength == 0)?

标签: c# windows winforms timer idle-processing


【解决方案1】:

如果处理时间过长,您可能应该在其自己的线程中开始处理。一旦获得新的输入,您就可以停止之前的计算并重新开始使用新信息(因此请考虑为您的线程设置取消机制)。

当你的线程完成后,你必须检查它的结果是否有效(同时选择没有改变)。最后,您可以将计算结果“同步”到 GUI,希望足够快:)

这仅在无需写入 GUI 即可完成一定数量的计算时才有效……我不确定您是否可以通过这种方式实现它。这取决于您的计算类型。

【讨论】:

  • 不,在那个线程中没有什么有用的。它无法访问 RTB 的任何属性。
  • @Hans ...这就是为什么我写它取决于计算的类型...做例如拼写检查可以在一个线程中完成......当然,为错误的单词着色必须在外面完成
猜你喜欢
  • 2021-08-12
  • 2017-03-13
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多