UWP Mvvm棱柱确认容器问题

UWP Mvvm棱柱确认容器问题,uwp,prism,Uwp,Prism,我正在UWP应用程序中使用Prism。我正在为中的每个视图模型注册一些启动参数 protected override async void ConfigureContainer() 我添加了async关键字,因为我想初始化ConfigureContainer()中可以等待的一些数据库连接。但现在我注意到,应用程序启动时(有时)没有启动ags,导致null ref异常。我是否应该在此方法中初始化任何连接?为什么应用程序没有在ConfigureContainer()上等待?当应用程序启动时

我正在UWP应用程序中使用Prism。我正在为中的每个视图模型注册一些启动参数

    protected override async void ConfigureContainer()
我添加了async关键字,因为我想初始化ConfigureContainer()中可以等待的一些数据库连接。但现在我注意到,应用程序启动时(有时)没有启动ags,导致null ref异常。我是否应该在此方法中初始化任何连接?为什么应用程序没有在ConfigureContainer()上等待?当应用程序启动时,我应该在哪里放置异步初始化方法调用?这里是方法

 protected override async void ConfigureContainer()
    {


        // register a singleton using Container.RegisterType<IInterface, Type>(new ContainerControlledLifetimeManager());
        base.ConfigureContainer();
        Container.RegisterInstance<IResourceLoader>(new ResourceLoaderAdapter(new ResourceLoader()));
        DocumentClient client = new DocumentClient(new Uri("https://docdb.etc/"),
             "my key", new ConnectionPolicy() { ConnectionMode = ConnectionMode.Direct });
        try
        {
            await client.OpenAsync();
        }
        catch (Exception ex)
        {

            throw new Exception("DocumentClient client could not open");
        }
        IDataAccessBM _db = new DataAccessDocDb(client, "ct", "ops");
        AddressSearch addresSearcher = new AddressSearch(_db, 4);
        StartUpArgs startUpArgs = new StartUpArgs
        {
            postCodeApiKey = "anotherKey",
            db = _db,
            fid = "bridge cars",
            dialogService = new DialogService(),
            addressSearcher = addresSearcher
        };
        startUpArgs.zoneSet = await _db.ZoneSetGetActiveAsync("another key");
        Container.RegisterInstance(startUpArgs);
    }
protectedoverride async void ConfigureContainer()
{
//使用Container.RegisterType(新ContainerControlledLifetimeManager())注册一个单例;
base.ConfigureContainer();
RegisterInstance(新ResourceLoaderAdapter(新ResourceLoader());
DocumentClient客户端=新DocumentClient(新Uri(“https://docdb.etc/"),
“我的密钥”,new ConnectionPolicy(){ConnectionMode=ConnectionMode.Direct});
尝试
{
等待client.OpenAsync();
}
捕获(例外情况除外)
{
抛出新异常(“DocumentClient无法打开”);
}
IDataAccessBM_db=新的DataAccessDocDb(客户端,“ct”、“ops”);
AddressSearch AddressSearcher=新地址搜索(_db,4);
StartUpArgs StartUpArgs=新的StartUpArgs
{
postCodeApiKey=“另一个密钥”,
db=_db,
fid=“桥梁车辆”,
dialogService=新建dialogService(),
addressSearcher=addressSearcher
};
startUpArgs.zoneSet=wait_db.ZoneSetGetActiveAsync(“另一个键”);
容器注册状态(startUpArgs);
}
我是否应该在此方法中初始化任何连接

至少不是异步的。我宁愿创建一个
ConnectionFactory
,它(可能是异步的)根据需要创建连接

为什么应用程序没有在ConfigureContainer()上等待

因为人们不能等待
无效
。这就是不鼓励使用
异步void
的原因。。。是
异步任务
中的
任务
等待ed,而不是
异步

当应用程序启动时,我应该在哪里放置异步初始化方法调用

没有
async
构造函数或
async new
之类的东西。探索您的选择的一个良好开端是

Container.RegisterInstance(新的ResourceLoaderAdapter(新的ResourceLoader())


注册实例很难看,而且大多数时候都是不必要的(这就是一个例子)。如果您重构代码让容器完成它的工作,那么异步初始化问题将消失。

不要将初始化代码放入

 protected override  void ConfigureContainer()
把它放在:

 protected override async Task OnInitializeAsync(IActivatedEventArgs args)
容器可以从那里访问,并且方法是异步的