0

我有一个繁重的函数,它使用大量的正则表达式将一个大测试匹配到富文本框中。

每次更改此文本( OnTextChangedEvent )时都会调用此函数。如果我写得很快,这个函数会使整个程序瘫痪一段时间。

我想到了一些解决方案,例如:

  • 事件延迟已更改
  • 线
  • 在空闲周期运行此函数。

哪个是最好的?以及如何将其应用于我的功能?

4

3 回答 3

1

不应从 OnTextChanged 调用此类函数。让它在后台线程中运行,完成后更新结果。想想 Intellisense 的工作原理——它由代码的任何更改触发,但只有在得到答案时才会更新屏幕。

于 2014-06-15T22:36:55.080 回答
0

你在征求意见。我的观点是,这个问题最好通过在单独的线程上运行来解决。

过去我们会在空闲循环上这样做,但确实没有优势而且相当痛苦。空闲循环仍然是一种合理的方式来执行必须不断更新 UI 的事情,但不值得麻烦。

您的其他建议无济于事。

但那只是我的个人意见。

于 2014-06-15T23:16:12.927 回答
0

我同意 Loren 的回答,但这里有更多信息/选项。

首先,繁重的 reg ex 应该在不同的线程上运行,而不是在你的 GUI 上运行。在您的 上OnTextChanged,设置全局脏位和时间戳(例如,:dirty @ 20:00)。

您的后台线程可以拾取它,然后在后台愉快地运行,直到它完成并更新 GUI。完成后,它可以检查在启动之后或自上次完成后是否有任何脏位。

如果更改使其正在执行的操作无效,则更好的方法可能是取消其正在运行的计算,但您没有为此提供足够的数据。

于 2014-06-15T23:15:20.823 回答