在 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;
}
所以我需要知道:
- 这是一个好的解决方案吗?
- 如何改进它使实例化以并行方式工作以避免UI暂停(实例化部分需要 5 秒!!)
您可以使用 async
和 await
来设置您的 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 时保持响应。
在我的 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
和 await
来设置您的 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 时保持响应。