摘要 :我想在构造函数中调用异步方法。这可能吗?
详细信息 :我有一个称为getwritings()JSON数据解析的方法。如果我只是调用getwritings()一个async方法并将其放在await左边,那么一切都会正常运行。但是,当我LongListView在页面中创建一个并尝试填充它时,我发现getWritings()返回的结果令人惊讶null,并且LongListView为空。
getwritings()
async
await
LongListView
getWritings()
null
为了解决这个问题,我试图改变的返回类型getWritings()来Task<List<Writing>>,然后通过检索结果中的构造getWritings().Result。但是,这样做最终会 阻塞UI线程。
Task<List<Writing>>
getWritings().Result
public partial class Page2 : PhoneApplicationPage { List<Writing> writings; public Page2() { InitializeComponent(); getWritings(); } private async void getWritings() { string jsonData = await JsonDataManager.GetJsonAsync("1"); JObject obj = JObject.Parse(jsonData); JArray array = (JArray)obj["posts"]; for (int i = 0; i < array.Count; i++) { Writing writing = new Writing(); writing.content = JsonDataManager.JsonParse(array, i, "content"); writing.date = JsonDataManager.JsonParse(array, i, "date"); writing.image = JsonDataManager.JsonParse(array, i, "url"); writing.summary = JsonDataManager.JsonParse(array, i, "excerpt"); writing.title = JsonDataManager.JsonParse(array, i, "title"); writings.Add(writing); } myLongList.ItemsSource = writings; } }
最好的解决方案是承认下载和下载设计的异步性。
换句话说,确定数据下载时应用程序的外观。让页面构造函数设置 该 视图,然后开始下载。下载完成后, 更新 页面以显示数据。
我有一篇关于异步构造函数的博客文章,您可能会觉得有用。另外,一些MSDN文章;一种是关于异步数据绑定(如果您使用的是MVVM),另一种是关于异步最佳实践的(即,应避免使用async void)。
async void