C# 在WPF应用程序中以并行方式实例化全局变量

C# 在WPF应用程序中以并行方式实例化全局变量,c#,wpf,multithreading,task,mvvm-light,C#,Wpf,Multithreading,Task,Mvvm Light,在我的WPF应用程序中,viewmodel类的实例化需要很多时间,因此我认为,要解决这个问题,在启动应用程序时创建静态对象: protected override void OnStartup(StartupEventArgs e) { ViewModelLocator locator = (ViewModelLocator)App.Current.Resources["Locator"]; LoginWindowViewModel.objFiche

在我的WPF应用程序中,viewmodel类的实例化需要很多时间,因此我认为,要解决这个问题,在启动应用程序时创建静态对象:

 protected override  void OnStartup(StartupEventArgs e)
    {

        ViewModelLocator locator = (ViewModelLocator)App.Current.Resources["Locator"];
        LoginWindowViewModel.objFicheViewModel = locator.FicheViewModel;
        LoginWindowViewModel.objFormationsViewModel = locator.FormationsViewModel;
        LoginWindowViewModel.objFacturationViewModel = locator.FacturationViewModel;
        LoginWindowViewModel.objGestionDPCViewModel = locator.GestionDPCViewModel;
        LoginWindowViewModel.objGestionGDPViewModel = locator.GestionGDPViewModel;

    }
所以我需要知道:

  • 这是一个好的解决方案吗
  • 如何改进它,使实例化并行工作,以避免UI暂停(实例化部分需要5秒!!)

  • 您可以使用
    async
    wait
    设置ViewModels

    public async void Setup()
        {
            this.IsSettingUp = true;
    
            await SetupViewModels();
    
            //Other initialization stuff here if needed
    
            this.IsSettingUp = false;
        }
    
    考虑这一点:

    在您的
    LoginWindowViewModel
    中创建一个名为IsSettingUp的属性,如下所示:

    private bool _IsSettingUp;
    
        public bool IsSettingUp
        {
            get { return _IsSettingUp; }
            set 
            { 
                _IsSettingUp = value;
    
                //On property changed stuff
                OnPropertyChanged();
            }
        }
    
    然后创建负责创建ViewModels的
    async
    方法

    public async void Setup()
        {
            this.IsSettingUp = true;
    
            await SetupViewModels();
    
            //Other initialization stuff here if needed
    
            this.IsSettingUp = false;
        }
    
    SetupViewModels方法的外观如下:

    private async Task SetupViewModels()
        {
            await Task.Factory.StartNew(() =>
            {
                ViewModelLocator locator = (ViewModelLocator)App.Current.Resources["Locator"];
                LoginWindowViewModel.objFicheViewModel = locator.FicheViewModel;
                LoginWindowViewModel.objFormationsViewModel = locator.FormationsViewModel;
                LoginWindowViewModel.objFacturationViewModel = locator.FacturationViewModel;
                LoginWindowViewModel.objGestionDPCViewModel = locator.GestionDPCViewModel;
                LoginWindowViewModel.objGestionGDPViewModel = locator.GestionGDPViewModel;
            });
        }
    

    < P> >使用<强> ISStutuffUn>强>属性,考虑创建一个控件,如果<强> IsStutoUp><强>是可见的控件。可能是加载图标,或屏幕覆盖。这将确保用户界面在创建ViewModels时保持响应。

    ViewModel的实例化不需要很长时间-它对应的是一个完整的数据屏幕,而不是屏幕本身。对于您的视图,它相当于DTO。除非您的数据首先是静态/只读的,否则无法将其转换为全局对象。您应该调查性能问题,而不是试图将它们隐藏在全局对象后面
    async void
    仅用于事件处理程序,而不用于异步执行方法。此外在一个方法中使用
    async/await
    是没有意义的,因为该方法只运行一个任务并被另一个方法等待-只需返回该任务。@PanagiotisKanavos您对此解决方案有何改进建议我在任务
    SetupViewModels
    @lamloumiaafif中有
    targetingexception
    ,请找出为什么使用ViewModels初始化需要很长时间。不要试图在开始时加载所有数据,只需为初始显示输入足够的数据即可。异步加载其余部分,如图所示。INotifyPropertyChanged事件和数据绑定将负责在ViewModel中的基础数据更改时更新视图