【问题标题】:Best way to execute heavy function that could freeze the program?执行可能冻结程序的繁重功能的最佳方法是什么?
【发布时间】:2014-06-15 22:18:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 这里有一个小问题——我不会有一个肮脏的位。相反,我会简单地存储上次修改的时间戳。如果上次计算的时间戳不匹配,则需要再次运行。
      • @LorenPechtel 在技术上是正确的。如果你有最后的修改,你可以检查它是否更晚,但我更喜欢这样的代码:if (dirty) ... 而不是 if (timestamp > last_timestamp),即使你可以编写一个名为 dirty 的辅助方法来为你做这件事。一样的。
      • 我不介意dirty() 函数。我介意有两个基本上做同样事情的变量。
      【解决方案3】:

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

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

      您的其他建议无济于事。

      但这只是我的意见。

      【讨论】:

        猜你喜欢
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2018-02-10
        相关资源
        最近更新 更多