2017-05-30 77 views
0

我有一個工作異步方法(網絡刮)工作,但不能更新視圖。 我可以看到INotifyPropertyChanged事件沒有觸發。我可以從任務<ObservableCollection <Class>>轉到ObservableCollection <Class>?

在我的構造我打電話,像這樣的異步方法:

Task<ObservableCollection<Team>> TeamRows2 = Scrape(); 

我刮痧方法返回:

ObservableCollection<Team> rows 

通過這種方法簽名:

private async Task<ObservableCollection<Team>> Scrape() 
ObservableCollection<Team> rows = new ObservableCollection<Team>(); 
// do Async work 
return rows; 

我可以看到行獲取充滿異步網站獲得的數據。

但是,Scrape調用在返回時似乎不會加載包含行的TeamRows2。

我需要從普通的ObservableCollection投從某種程度上任務爲工作?

謝謝

+0

演員?不,不,不,不...你想要的是[結果](https://msdn.microsoft.com/en-us/library/dd321468(v = vs.110).aspx)。編輯:我認爲沒有'async'會更好。 – Theraot

+0

您需要等待任務完成。無論是「await」還是調用任務 – Jonesopolis

+2

上的「.Result」Do ** not **使用Task.Result。閱讀[Stephen Cleary]的偉大博客(https://blog.stephencleary.com/)爲什麼你不應該這樣做 –

回答

0

由於意見已經建議您需要等待任務完成。有方法調用Task.Result,但有一些常見的情況下,調用此方法會導致應用程序出現死鎖,並且一切都會停止。

作爲一般規則,你可以說:決不.Result/.Wait混合async/await

現在你的主要問題是,你是在構造函數中工作,需要等待你的任務來完成。我更喜歡這個問題的解決方案是靜態工廠方法。

像這樣:

public static async Task<YourClass> CreateAsync(…) 
{ 
    var rows = await Scrape(); 
    return new YourClass(rows, …); 
} 

構造函數設置爲私有,當你需要創建類的實例一個調用CreateAsync方法。

這種解決方案假定Scrape方法是靜態的爲好。但它應該是無論如何,如果你從構造函數中調用它(或者至少應該很容易使它成爲static,因爲它可以接收的所有參數都必須傳遞給構造函數

另一種解決方案是使用初始化函數,如果你不能將Scape方法變成靜態的,這將是解決方案,即使在這種情況下,我也會建議一種工廠方法,以避免暴露未正確初始化的類的實例

在這種情況下你基本上需要兩個這樣的方法:

public static async Task<YourClass> CreateAsync(…) 
{ 
    var result = new YourClass(…); 
    await result.InitializeAsync(); 
    return result; 
} 

private async Task InitializeAsync() 
{ 
    TeamRows2 = await Scrape(); 
} 
+0

謝謝Nitram,它確實是由於在構造函數內完成的。 – redt

相關問題