7

我有一个启动对话框按钮,它创建一个窗口的视图模型并将其绑定到窗口(它启用了 UI 虚拟化)。第一次单击时启动对话框只需 1 秒钟。但是,如果我非常频繁地或背靠背地打开同一个对话框,它会开始花费更多时间来填充网格数据源以进行下一次迭代。如果我暂停一下,然后再次打开窗口,则只需大约 1 或 2 秒。

for first time populating the item source it take only 1 second:
next time populating the item source it takes  2 second
next time populating the item source it takes  3 second
next time populating the item source it takes  6 second
next time populating the item source it takes  8 second

但是,如果我不推荐调用 GC.Collect(),那么填充网格数据源总是需要大约 1 秒。但调用

Gc.Collect()
Gc.WaitForPendingFinalizer()
Gc.Collect()

每次迭代都花费了我一些时间。

我知道打电话GC.Collect不是一个好的选择。任何人都可以建议我如何提高我的应用程序性能。

我更关心用户机器,因为我的机器配置非常好,而用户机器可能没有那么快。

4

1 回答 1

3

如果不查看代码,很难确定确切的问题。但是,通常这可能由于几个原因而发生。

  1. 它每次都加载更多数据(可能是两倍?)。您已经表明它每次只加载 200 条记录。但请确保您的逻辑正确,并在重新发布之前清除以前的数据。

  2. 确保您取消订阅任何事件订阅。有时可能会触发以前的网格实例的隐藏事件。您可以通过在偶数句柄上放置一个中断并检查它是否多次触发来轻松检查。

  3. 查看您正在创建的每个 Disposable 实例,并检查您是否正确处置它们。可能您没有处理一次性实例,这可能是 GC.Collect 帮助的原因。

  4. 我不太确定这里是否涉及虚拟化。在没有虚拟化的情况下执行相同的测试,以确保这不是原因。

于 2016-02-08T22:41:51.763 回答