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