我正在尝试创建一个使用单点登录和实时连接的应用,并根据他的实时连接信息自动注册用户。
当我的应用程序启动时,我调用我的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模式或者我做了一些非常错误的奇怪感觉等待和异步......
任何人都可以帮我澄清这种行为吗?
答案 0 :(得分:4)
你应该avoid async void
, as I describe in a recent MSDN article。
在AuthInitializeAsync
返回Task
而不是void
后,您可以在创建视图模型之前await
。