Yog*_*esh 7 c# wpf garbage-collection data-virtualization
我有一个启动对话框按钮,它创建一个窗口的视图模型并将其绑定到窗口(它启用了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
Run Code Online (Sandbox Code Playgroud)
但是,如果我调用不推荐的GC.Collect(),那么填充网格数据源总是需要大约1秒钟.但呼唤
Gc.Collect()
Gc.WaitForPendingFinalizer()
Gc.Collect()
Run Code Online (Sandbox Code Playgroud)
每次迭代花费我一些时间.
我知道打电话GC.Collect不是一个好选择.任何人都可以建议我如何提高我的应用程序性能.
我更关心用户机器,因为我的机器具有非常好的配置,而用户机器可能不那么快.
如果不查看代码,很难查明确切的问题。但是,通常会由于多种原因而发生这种情况。
它每次都会加载更多数据(可能是双倍?)。您已经指出它每次只加载 200 条记录。但请确保您的逻辑正确,并且在重新发布之前会清除以前的数据。
确保您取消订阅任何事件订阅。有时可能会触发先前网格实例的隐藏事件。您可以通过在偶数手柄上放置一个中断并检查它是否触发多次来轻松检查这一点。
查看您正在创建的每个一次性实例,并检查是否正确处置它们。也许您没有处理一次性实例,这可能是 GC.Collect 提供帮助的原因。
我不太确定这里是否涉及虚拟化。在没有虚拟化的情况下执行相同的测试,以确保这不是原因。