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

instantiate global variables in parallel way within WPF application

在我的 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;

    }

所以我需要知道:

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

您可以使用 asyncawait 来设置您的 ViewModels。

考虑一下:

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

private bool _IsSettingUp;

    public bool IsSettingUp
    {
        get { return _IsSettingUp; }
        set 
        { 
            _IsSettingUp = value;

            //On property changed stuff
            OnPropertyChanged();
        }
    }

然后创建一个 async 方法来负责创建您的 ViewModel。

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;
        });
    }

要使用 IsSettingUp 属性,请考虑创建一个在 IsSettingUp 为真时可见的控件。也许是一个加载图标,或者一个屏幕覆盖。这将确保 UI 在创建 ViewModel 时保持响应。