2013-07-24 116 views
2

我正在嘗試創建一個應用程序,它使用單點登錄與實時連接並基於他的實時連接信息自動註冊用戶。如何等待異步方法返回?

權當我的應用程序啓動時我把我的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屬性,這就是爲什麼它說它爲空。

通常我會等待,直到App.CurrentUser屬性被設置爲不是null的東西,但我無法擺脫奇怪的感覺,我錯過了實現MVVM模式的權利,或者我做了一件非常棒的事情等待和異步錯誤...

任何人都可以幫我澄清這種行爲?

+1

從調用LoadProfileAsync()的前面除去'await'; '等待'已經在LoadProfileAsync()內完成了。 –

+0

或反之亦然,如果這適合您的企業需要更合適。沒有必要等待兩次,廣告這樣做只會混淆事項。 –

回答

4

您應該avoid async void, as I describe in a recent MSDN article

一旦你讓AuthInitializeAsync返回Task而不是void,那麼你可以在創建你的視圖模型之前await

+0

嗨斯蒂芬,謝謝你的回答。我已經在另一篇文章中閱讀了你的MSDN文章,這裏是關於stackoverflow的。我的問題是,如果我將返回類型更改爲任務,我無法在構造函數中正確調用此函數(這正是我實際正在做的)。有什麼辦法可以讓我的構造函數仍然有效嗎? – Evils

+1

我在['async'構造函數](http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html)上有博客條目。在我的MVVM項目中,我使用'async'工廠方法遵循VM優先模式。但是,如果您使用的是IoC或V-first模式,那麼您需要使用我的博客中描述的異步初始化模式。 –