2

Ich lerne asynchrone (UWP) Methoden im Moment und kann mich nicht richtig mit der Syntax herumschlagen. Alle Beispiele haben viel mehr zu tun als nur die asynchronen Aufrufe der Aufgabe und zeigen nicht wirklich, wie sie initiiert werden. Die Hauptsache, die ich nicht verstehe, ist, wie man die Aufgabe von einer nicht-asynchronen Methode initiiert. Jedes Mal, wenn ich versuche, die Aufgabe aufzurufen, möchte ich, dass diese Methode in eine asynchrone umgewandelt wird. Was wiederum von mir verlangen würde, dass ich jede Methode, die diese Methode aufruft, in Async verwandle. Wie soll man anfangen?Aufruf einer Asyc Aufgabe <T> Methode

Der aktuelle Anwendungsfall, den ich versuche, ist, eine JSON-Datei voller Benutzernamen und IDs aus UWP-Localspeicher abzurufen, die jetzt in UWP ein Async-Aufruf ist. Ich bin mir ziemlich sicher, dass meine Methode korrekt ist, aber ich habe Probleme, sie anzurufen. Momentan rufe ich die Methode im Code hinter der Seite auf, die sie unterstützt, wo sich die aktuelle Methode derzeit in der Benutzerklasse befindet.

hier ist der Code ich habe:

public async Task<List<User>> getUsers() 
    { 
     List<User> u = new List<User>(); 
     StorageFolder folder = ApplicationData.Current.LocalFolder; 
     StorageFile file = await folder.GetFileAsync("LocalUsers.txt"); 
     string Json = await FileIO.ReadTextAsync(file); 
     List<User> existingUsers = new List<User>(); 
     existingUsers = JsonConvert.DeserializeObject<List<User>>(Json); 
     return existingUsers; 
    } 

und das ist, wie ich die Methode aus dem Code hinter

List<User> users = await User.getUsers(); 

ich Aufgaben auch wie diese habe versucht anzurufen versuchte, Laufen, aber ich glaube nicht, dass mein Sytax richtig ist oder etwas

Task t = new Task(User.getUsers()); 

Jede Hilfe wird sehr appreciated sein. Vielen Dank.

+2

Warum nicht die aufwändige Methode 'async' machen, wie empfohlen? – David

+0

Das werde ich wohl in Zukunft tun, aber es schien so, als würde Async immer weiter in den Code hineinkriechen und ich dachte nicht, dass das der richtige Weg war, aber wie andere darauf hingewiesen haben, ist dies in der Tat das Richtige Weg. – evilsushi

Antwort

0

Wenn Sie nicht über die anrufende Methode Asynchron machen wollen, dann tun würde folgende

List<User> users = User.getUsers().Result; 
+0

Funktioniert wie ein Charme! – evilsushi

+0

Rufen Sie '.Result' nicht auf, sondern verwenden Sie' erwarten' –

+0

OP wollen Sie nicht die Methode async wie oben beschrieben machen, also nicht warten – SirH

2

Async Best Practices MSDN

Async Code neigt eine ganze Code-Basis zu infizieren. Sie können die Aufgabe synchron mit Task.Wait ausführen. Dies ist jedoch nicht empfehlenswert. Sie können es auch mit Task.Run an einen Hintergrund-Thread senden, aber natürlich können Sie dann keine Ergebnisse abrufen.

+0

Laut Ihrem Artikel sollte ich nur async den ganzen Weg verwenden?Was ist mit Methoden, die nicht asynchron sind? Kann ich nicht asynchronen Code asynchron ausführen? – evilsushi

+0

@evilsushi Sie könnten synchronen Code in einer asynchronen Methode ausführen, ja. Wie bereits erwähnt, könnten Sie mit Task.Run einen Thread im Threadpool starten und die asynchronen Aufgaben von Ihren synchronen Aufgaben segmentieren. – bodangly

+0

Danke für die Informationen, ich muss den Artikel mehr lesen und die beste Art und Weise, um fortzufahren. – evilsushi

6

Die Hauptsache, die ich nicht verstehe, ist, wie man die Aufgabe von einer nicht asynchronen Methode initiiert. Jedes Mal, wenn ich versuche, die Aufgabe aufzurufen, möchte ich, dass diese Methode in eine asynchrone umgewandelt wird. Was wiederum von mir verlangen würde, dass ich jede Methode, die diese Methode aufruft, in Async verwandle. Wie soll man anfangen?

Wie ich in meinem Async Best Practices Artikel, async does "grow" through the code base beschreiben. Dies ist natürlich und sollte angenommen werden. Vor allem auf einer Plattform wie UWP, wo blocking on asynchronous code can easily cause deadlocks sowie verdienen Sie eine sofortige Disqualifikation aus dem App Store.

In den einfachsten Situationen stoppt das Wachstum async bei einem asynchronen Ereignishandler, der async void ist. Wenn Sie MVVM-basierte Entwicklung durchführen, gibt es andere Überlegungen; Ich behandle diese in einer dreiteiligen MSDN-Artikelserie unter async MVVM development. Wenn Sie eine vorhandene Codebasis haben, finden Sie möglicherweise auch meine article on brownfield async helpful.

+0

Während ich nicht die Antwort erhofft habe, ist es wahrscheinlich die Antwort, die ich auf lange Sicht brauche, danke. – evilsushi

Verwandte Themen