【发布时间】:2013-07-24 14:49:10
【问题描述】:
我正在尝试创建一个应用,它使用单点登录和实时连接并根据用户的实时连接信息自动注册用户。
当我的应用程序启动时,我调用我的 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”属性时,await 仍然没有将我的用户返回到我的 App.CurrentUser 属性,这就是它说它为 null 的原因。
通常我会等到 App.CurrentUser 属性设置为 null 以外的其他值,但我无法摆脱一种奇怪的感觉,我要么错过了正确实现 MVVM 模式,要么我做了一些非常错误的事情使用等待和异步...
谁能帮我澄清这种行为?
【问题讨论】:
-
从对 LoadProfileAsync() 的调用前面删除
await;awaiting 已经在 LoadProfileAsync() 中完成。 -
反之亦然,如果这更适合您的业务需求。没有必要等待两次,这样做只会使事情变得混乱。
标签: c# mvvm asynchronous async-await