Asynchrone Methode im Konstruktor aufrufen?
Zusammenfassung: ich möchte sagen, dass eine asynchrone Methode in einen Konstruktor. Ist das möglich?
Details: ich habe eine Methode namens getwritings()
Parsen der JSON-Daten. Alles funktioniert gut, wenn ich nur call getwritings()
in einem async
Methode und setzen await
nach Links. Allerdings , wenn ich ein LongListView
in meine Seite, und versuchen Sie, zu bevölkern, ich finde, dass getWritings()
ist überraschend Rückkehr null
und die LongListView
leer ist.
Um dieses problem anzugehen, ich habe versucht, ändern Sie den Rückgabetyp der getWritings()
zu Task<List<Writing>>
und dann abrufen das Ergebnis im Konstruktor über getWritings().Result
. Tun Sie jedoch, die bis Ende Blockierung der 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"];
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;
}
}
InformationsquelleAutor der Frage KBB | 2014-04-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die beste Lösung ist, zu erkennen an der asynchronen Natur der download und design.
In anderen Worten, entscheiden, wie Ihre Anwendung Aussehen sollte, während die Daten herunterladen. Habe die Seite Konstruktor eingerichtet dass anzeigen, und starten Sie den download. Wenn der download abgeschlossen ist update die Seite zum anzeigen der Daten.
Habe ich einen blog-post auf asynchrone Konstruktorendie Sie nützlich finden können. Auch einige MSDN-Artikeln; eine auf asynchrone Daten-Bindung (wenn Sie mit MVVM) und anderen auf asynchrone best practices (d.h., Sie sollten es vermeiden
async void
).InformationsquelleAutor der Antwort Stephen Cleary
Können Sie auch tun, genau wie dieser:
InformationsquelleAutor der Antwort Peter Stegnar
Möchte ich ein Muster, dass ich ' ve wurde mit zu lösen diese Art von Problemen. Es funktioniert ziemlich gut, denke ich. Natürlich, es funktioniert nur, wenn Sie die Kontrolle haben über das, was ruft den Konstruktor. Beispiel unten
Im Grunde, was wir tun, ist, stellen Sie den Konstruktor privat und machen unsere eigenen public static async-Methode, ist verantwortlich für die Erstellung einer Instanz von MyClass. Indem der Konstruktor private und halten Sie die statische Methode in der gleichen Klasse haben wir sichergestellt, dass niemand könne "versehentlich" erstellen Sie eine Instanz dieser Klasse, ohne die korrekte Initialisierung Methoden. Die ganze Logik rund um die Erstellung des Objekts ist immer noch innerhalb der Klasse (nur innerhalb einer statischen Methode).
Implementiert auf das aktuelle Szenario würde es so Aussehen:
Und anstatt das zu tun,
Würdest du tun
InformationsquelleAutor der Antwort Shazi
Versuchen zu ersetzen:
mit diesem
InformationsquelleAutor der Antwort csharpwinphonexaml
Könnten Sie versuchen,AsyncMVVM.
Page2.xaml:
Page2.xaml.cs:
ViewModel2.cs:
InformationsquelleAutor der Antwort Dmitry Shechtman
Um es einfach auszudrücken, bezieht sich auf Stephen Cleary https://stackoverflow.com/a/23051370/267000
Ihre Seite soll die Schöpfung Aufgaben erstellen im Konstruktor, und Sie sollten erklären, diese Aufgaben als Schüler, oder legen Sie Sie in Ihre Aufgabe-pool.
Ihre Daten abgerufen werden, während diese Aufgaben, aber diese Aufgaben sollten Sie erwarteten in den code also auf einige UI-Manipulationen, d.h. Klicken Sie auf Ok etc.
Ich entwickelte solche apps in den WP, wir hatten eine ganze Reihe von Aufgaben erstellt auf der Startseite.
InformationsquelleAutor der Antwort Dmitry