执行可能冻结程序的繁重功能的最佳方法是什么?

时间:2014-06-15 22:18:58

标签: c# multithreading delay system-idle-process

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

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

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

  • 事件延迟更改
  • 在空闲周期运行此功能。

哪个最好?我怎样才能将它应用到我的函数中?

3 个答案:

答案 0 :(得分:1)

不应该从OnTextChanged调用这样的函数。使其在后台线程中运行,在完成后更新结果。想想Intellisense是如何工作的 - 它是由对代码的任何更改引发的,但只有在得到答案时才更新屏幕。

答案 1 :(得分:0)

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

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

你的后台线程可以选择这个,并在后台运行愉快,直到它完成,并更新GUI。一旦完成,它可以检查是否有任何脏位在它启动后或自上次完成后出现。

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

答案 2 :(得分:0)

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

过去我们会在空闲循环中完成它,但确实没有优势和相当多的痛苦。空闲循环仍然是一种合理的方式来做必须不断更新UI的事情,否则不值得麻烦。

你的其他建议无处可去。

但那只是我的意见。