c# - 为什么 View 在 Prism 复合 wpf 应用程序中第一次加载非常慢

标签 c# wpf performance prism

第一次在一个区域内显示一个 View 大约需要 5-10 秒,并且在我的 Prism Composite WPF 应用程序中 UI 在此期间卡住。在随后的时间里,View 的加载速度相对更快,没有任何 UI 卡住。 View 由 Devexpress WPF 网格控件组成,数据从 SQL 数据库中获取。我不认为它与网格控件/绑定(bind)有问题,即使我删除了与网格控件的绑定(bind),View 也几乎需要相同的时间将自身呈现到区域中。

这是我用来将 View 加载到 Shell 中定义的区域的代码:

public Action<MenuModel> LoadViewRequest { get; set; }

public SyncController(IUnityContainer container, IEventAggregator eventAggregator, IRegionManager regionManager)
{
    this.container = container;
    this.eventAggregator = eventAggregator;
    this.regionManager = regionManager;
    this.LoadViewRequest = (menuItem) => { LoadRequestedView(menuItem); };
    this.eventAggregator.GetEvent<ViewRequestedEvent>().Subscribe(LoadViewRequest, ThreadOption.UIThread, true, i => i.Module == "Sync");
}

private void LoadRequestedView(MenuModel menuItem)
{
    try
    {
        IViewModel viewModel = this.container.Resolve<SynchronizeViewModel>();
        this.regionManager.Regions["ViewRegion"].Add(viewModel.View);
        this.regionManager.Regions["ViewRegion"].Activate(viewModel.View);
        viewModel.DisplayName = menuItem.Description;
        this.eventAggregator.GetEvent<ViewNotificationEvent>().Publish(menuItem.Description);
    }
    catch (ResolutionFailedException) { }
}

这种行为背后的原因可能是什么?为什么View在第二次加载时几乎是瞬间加载?这是否意味着即使从 Region 中删除 View 后,我的应用程序仍保留对 View 的引用?

最佳答案

任何性能问题的答案始终是使用分析器。我们可以整天猜测问题是什么,但如果没有确凿的事实,那只能是猜测。

您应该学习使用性能分析器。我推荐的是 Redgate 的 ANTS Performance Profiler (http://www.red-gate.com/products/ants_performance_profiler/index.htm)。它易于使用,并且在网站和程序中对初学者有很多帮助。

这将毫无疑问地告诉您瓶颈在哪里。

关于c# - 为什么 View 在 Prism 复合 wpf 应用程序中第一次加载非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1684568/

相关文章:

c# - 如何在同一解决方案中使用来自多个项目的 NLog

r - 用于按组 ID 子集数据的 for 循环的更高性能替代方案是什么?

c# - 试图将 foreach 转换为 linq 等价物

c# - HttpHandler 和 XML 文件

c# - 如何从服务可靠地捕获 Windows 登录、注销、锁定和解锁事件?

c# - 如何对泛型类进行分组?

c# - 在计算机启动时启动 WPF 应用程序

c# - WPF中如何直接在位图(BitmapSource、WriteableBitmap)上绘制?

c++ - 为什么在第三个文件之前写入两个文件,即使指令是每次迭代都执行一个文件?

mysql - 将一行中的选定列转换为多行