c# - Call asynchronous method in constructor? -
summary: call asynchronous method in constructor. possible?
details: have method called getwritings() parses json data. works fine if call getwritings() in async method , put await left of it. , when create longlistview in page , try populate i'm finding getwritings() surprisingly returning null , longlistview empty.
to address problem, tried changing return type of getwritings() task<list<writing>> , retrieving result in constructor via getwritings().result. however, doing ends blocking ui thread.
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"]; (int = 0; < 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; } }
the best solution acknowledge asynchronous nature of download , design it.
in other words, decide application should while data downloading. have page constructor set that view, , start download. when download completes update page display data.
i have blog post on asynchronous constructors may find useful. also, msdn articles; 1 on asynchronous data-binding (if you're using mvvm) , on asynchronous best practices (i.e., should avoid async void).
Comments
Post a Comment