2012-08-29 145 views
0

我正在學習Windows 8編程,並且我至少在某種程度上讓它工作幾個小時之前一直在處理這個問題。這個功能似乎現在正在工作。但它肯定不好看。更新ViewModel中新的啓動線程的可綁定屬性

函數做登錄,如果登錄成功,那麼它應該剝離更新商家的任務。執行不應該等待商家清單完成。

Tricky部分是那些也會觸發OnPropertyChanged並需要在UI線程中執行的那些加載屬性。

public async Task<bool?> LoginAsync(string username, string password) 
{ 
    var uri = new Uri(string.Format("{0}/User/Login?userName={1}&password={2}", ServerURL, username, password)); 

    bool? result = await GetJsonAsync<bool?>(uri); 

    if(result.HasValue && result.Value) 
    { 
     LoginDone = true; 
     LoadingMerchants = true; 
     var task = Task.Run(async() => { await LoadMerchantsAsync(); }); 
     var uitask = task.ContinueWith((loadtask) => { LoadingMerchants = false; }, TaskScheduler.FromCurrentSynchronizationContext()); 
    } 

    return result; 

} 

是Task.Run正確的方式開始執行新腳步?

我有很多不需要的額外等待嗎?

回答

0

Task.Run是在線程池線程上啓動執行的正確方法。但你並不需要它。

這應該只是罰款:

public async Task LoadMerchantsAndUpdateUiAsync() 
{ 
    LoadingMerchants = true; 
    await LoadMerchantsAsync(); 
    LoadingMerchants = false; 
} 

public async Task<bool?> LoginAsync(string username, string password) 
{ 
    var uri = new Uri(string.Format("{0}/User/Login?userName={1}&password={2}", ServerURL, username, password)); 

    bool? result = await GetJsonAsync<bool?>(uri); 
    if (result.HasValue && result.Value) 
    { 
    LoginDone = true; 
    LoadMerchantsAndUpdateUiAsync(); 
    } 

    return result; 
} 
+0

它的工作原理。看起來好多了。 :) –