最好的方式来执行繁重的功能,可能冻结程序

本文关键字:冻结 程序 功能 方式 执行 | 更新日期: 2023-09-27 18:08:39

我有一个很重的函数,它使用了很多正则表达式来匹配一个大的测试到富文本框。

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

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

  • 事件发生延迟
  • 线程
  • 在空闲周期运行此功能。

哪个是最好的?我怎么把这个应用到函数上呢?

最好的方式来执行繁重的功能,可能冻结程序

这样的函数不应该从OnTextChanged中调用。让它在后台线程中运行,完成后更新结果。想想智能感知是如何工作的——它是由代码的任何更改触发的,但只有当它得到答案时才更新屏幕。

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

首先,重正则表达式应该在不同的线程上运行,而不是在GUI上运行。在OnTextChanged上,设置全局脏位和时间戳(例如:dirty @ 20:00)。

你的后台线程可以拾取这个,并在后台愉快地运行,直到它完成,并更新GUI。一旦完成,它可以检查是否有任何脏位出现在它开始之后,或者自从上次完成。

一个更好的方法可能是取消它正在运行的计算,如果更改使它正在做的事情无效,但您没有为此提供足够的数据。

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

在过去,我们会在空闲循环中完成它,但这真的没有优势,而且相当痛苦。对于必须不断更新UI的事情,空闲循环仍然是一种合理的方式,但在其他方面不值得麻烦。

你的其他建议没有意义。

这只是我的看法。