繁体   English   中英

如何等待异步方法返回?

[英]How to wait for async method to return?

我正在尝试创建一个使用单点登录进行实时连接的应用程序,并根据其实时连接信息自动注册用户。

就在我的应用程序启动时,我调用LiveConnectViewModel并调用这两个函数:

        public async void AuthInitialize() 
    {
        string[] scopes = new[] { "wl.signin", "wl.basic", "wl.photos", "wl.emails", "wl.skydrive" };

        liveAuthClient = new LiveAuthClient();
        LiveLoginResult liveLoginResult = await liveAuthClient.InitializeAsync(scopes);

        if (liveLoginResult.Status == LiveConnectSessionStatus.Connected)
        {
            App.Session = liveLoginResult.Session;
        }
        else 
        {
            liveLoginResult = await liveAuthClient.LoginAsync(scopes);
            App.Session = liveLoginResult.Session;
        }
        await LoadProfileAsync();
    }

    public async Task LoadProfileAsync() 
    {
        LiveConnectClient client = new LiveConnectClient(App.Session);
        LiveOperationResult liveOperationResult = await client.GetAsync("me");
        LiveOperationResult liveOperationResultPicture = await client.GetAsync("me/picture");
        dynamic dynResult = liveOperationResult.Result;
        dynResult.picture = liveOperationResultPicture.Result;
        User currentUser = await UserViewModel.findOrCreateUserAsync(dynResult);
        App.currentUser = currentUser;
    }

之后,当启动画面消失并且我的视图出现时,将调用另一个方法。

这执行该代码:

        public ProfilePageViewModel()
    {
        this.CurrentUser = App.currentUser;
    }

现在我的总体问题是时间安排。 当我调试应用程序时,可以看到首先调用LiveConnectViewModel并进行了初始连接,然后执行了LoadProfileAsync,直到我的程序到达第一个await语句为止。

到了这一点,我的应用程序立即停止在此调用上的工作并继续运行。 现在,当谈到我的ProfilePageViewModel并设置我的“ CurrentUser”属性时,等待仍然没有将我的用户返回给我的App.CurrentUser属性,这就是为什么它说它为null的原因。

通常,我只是等到App.CurrentUser属性设置为null以外的其他值,但是我无法摆脱这种奇怪的感觉,我要么错过了实现MVVM模式的正确性,要么我在等待和执行时做错了非常严重的事情异步...

谁能帮助我澄清这种现象?

正如我在最近的MSDN文章中所描述的,您应该避免async void

一旦使AuthInitializeAsync返回Task而不是void ,您就可以在创建视图模型之前await它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM