2017-05-30 76 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

相关问题