我有一个Windows Phone应用程序,它从RSS Feed获取数据并缓存以前的文章。
public class MainViewModel : BaseViewModel
{
private ObservableCollection<Article> _articles;
}
在我的viewmodel中,我希望能够通过异步方法加载缓存数据并通过另一种异步方法继续加载在线数据,以便应用程序可以在加载Web内容时快速显示数据。我的代码目前看起来像这样:
Task.Factory.StartNew(() => _model.LoadDataAsync())
.ContinueWith(antecendent => _model.RefreshDataAsync())
.Wait();
LoadDataAsync 和 RefreshDataAsync 方法返回列表&lt;文章&gt; 。
public async Task<List<Article>> LoadDataAsync() { ... }
public async Task<List<Article>> RefreshDataAsync() { ... }
但是,当我尝试将结果分配给我的文章时:
_articles = await Task.Factory.StartNew(() => _modelArticles.LoadDataAsync())
.ContinueWith(antecendent => _modelArticles.RefreshDataAsync())
.Wait();
它告诉我,我“无法等待虚空”。那么我可以对我的代码做些什么来让它首先给我 LoadDataAsync 列表,并在完成后添加 RefreshDataAsync 列表?
对于那些熟悉它的人,我希望模仿显示缓存文章的WPCentral应用程序的行为,然后淡出并添加新文章。
答案 0 :(得分:6)
错误消息是因为您的代码是await
Wait
的结果,void
(而不是await
能够)。您应该删除对Wait
的调用。
更多提示:
Task.Run
instead of Task.Factory.StartNew
(正如我在博客中所述)。Wait
with asynchronous tasks(再次,链接到我的博客)。await
代替ContinueWith
。NotifyTaskCompletion
中的AsyncEx library。你可以先试试这个:
_articles = await Task.Run(() => _modelArticles.LoadDataAsync());
_articles = await Task.Run(() => _modelArticles.RefreshDataAsync());
但我不相信Task.Run
是必要的:
_articles = await _modelArticles.LoadDataAsync();
_articles = await _modelArticles.RefreshDataAsync();