最好的方式来执行繁重的功能,可能冻结程序
本文关键字:冻结 程序 功能 方式 执行 | 更新日期: 2023-09-27 18:08:39
我有一个很重的函数,它使用了很多正则表达式来匹配一个大的测试到富文本框。
每次这个文本被改变(OnTextChangedEvent)被调用这个函数。如果我写得很快,这个函数会使整个程序瘫痪一段时间。
我想到了一些解决方案,如:
- 事件发生延迟 线程
- 在空闲周期运行此功能。
哪个是最好的?我怎么把这个应用到函数上呢?
这样的函数不应该从OnTextChanged中调用。让它在后台线程中运行,完成后更新结果。想想智能感知是如何工作的——它是由代码的任何更改触发的,但只有当它得到答案时才更新屏幕。
我同意Loren的回答,但这里有一些更多的信息/选项。
首先,重正则表达式应该在不同的线程上运行,而不是在GUI上运行。在OnTextChanged
上,设置全局脏位和时间戳(例如:dirty @ 20:00)。
你的后台线程可以拾取这个,并在后台愉快地运行,直到它完成,并更新GUI。一旦完成,它可以检查是否有任何脏位出现在它开始之后,或者自从上次完成。
一个更好的方法可能是取消它正在运行的计算,如果更改使它正在做的事情无效,但您没有为此提供足够的数据。
你在征求意见。我的观点是,这个问题最好通过在一个单独的线程上运行来解决。
在过去,我们会在空闲循环中完成它,但这真的没有优势,而且相当痛苦。对于必须不断更新UI的事情,空闲循环仍然是一种合理的方式,但在其他方面不值得麻烦。
你的其他建议没有意义。
这只是我的看法。