【问题标题】:.Net (2.0) Asynchronous Thread vs. UI Thread Performance [closed].Net(2.0)异步线程与UI线程性能[关闭]
【发布时间】:2011-10-05 14:52:37
【问题描述】:

我正在寻找一个解释,为什么当我运行在 UI 线程上执行一些繁重递归处理的代码时,代码会在大约 90 秒内执行。然而,当我在异步线程(而不是 UI 线程)上运行相同的代码时,代码几乎立即执行?任何解释将不胜感激。

TY, 乔什

【问题讨论】:

  • 你能发布一些关于这两个场景的代码吗?在这两种情况下其他因素是否相同?有了给定的信息,我想不出应该是这种方式的特定原因。
  • 邮政编码不是一个选项。在这两种情况下,因素“似乎”是相等的。我发布了这个问题,因为“有了给定的信息,我想不出应该这样的特定原因”。所以你在重申我的问题。TY。
  • 是什么让你相信异步代码是立即执行的?你确定它返回正确的值吗?你用什么方法来表示完成?
  • 处理完成后,我加载了一个 TreeView 并且可以直观地确认我得到了相同的结果。我也有一些确认结果的调试语句。我正在使用 ManualResetEvent (.Set()) 向 UI 发出我的异步线程已完成处理的信号。感谢您的回复。
  • 为什么没有在选项上发布代码?代码是否更新了任何公共属性?

标签: .net multithreading user-interface asynchronous recursion


【解决方案1】:

可能有几个答案。如果您正在更新数据绑定的数据字段,那么 UI 可能会做很多工作来呈现更新的数据。这可能会导致您的处理速度减慢许多数量级。

另外,如果您使用的是内存受限的机器并且您的 UI 很大,那么您在打开 UI 时可能会遇到内存限制。或许你在页面文件中翻来覆去。

此外,根据您的 UI 类型,可能存在堆栈大小或您遇到的其他限制,当代码在不同线程上运行时不存在这些限制。

您的 UI 是否捕捉到任何可能从您的递归处理更改的数据中引发的事件?

【讨论】:

  • 感谢您的回复。我考虑到“更新数据绑定数据字段”可能会减慢代码速度,因此我隔离了任何 UI 数据绑定的递归逻辑。
  • 就内存而言,我认为这不是问题,因为代码递归搜索的 12,000 个对象相对较轻(并且我正在运行代码的机器具有 16GB RAM,其中大多数它是免费的)。对于您的第三个建议,虽然我没有捕捉或明确抛出任何事件,但系统可能正在生成 UI 事件。 TY 为您提供建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 2017-07-03
  • 1970-01-01
  • 2013-10-16
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多