C# 在WPF应用程序中以并行方式实例化全局变量
在我的WPF应用程序中,viewmodel类的实例化需要很多时间,因此我认为,要解决这个问题,在启动应用程序时创建静态对象: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
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;
}
所以我需要知道:
您可以使用
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中的基础数据更改时更新视图