如何等待异步方法返回?

时间:2013-07-24 22:10:30

标签: c# mvvm asynchronous async-await

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

当我的应用程序启动时,我调用我的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;
    }

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

执行该代码:

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

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

当达到此点时,我的应用程序立即停止处理此呼叫并继续。现在说到我的ProfilePageViewModel并且它应该设置我的“CurrentUser”属性,await仍然没有将我的用户返回到我的App.CurrentUser属性,这就是为什么它说它为空。

通常我会等到App.CurrentUser属性被设置为null以外的东西,但是我无法摆脱我错过实现MVVM模式或者我做了一些非常错误的奇怪感觉等待和异步......

任何人都可以帮我澄清这种行为吗?

1 个答案:

答案 0 :(得分:4)

你应该avoid async void, as I describe in a recent MSDN article

AuthInitializeAsync返回Task而不是void后,您可以在创建视图模型之前await