2017-08-02 3 views
1

Danke für alle Antworten, ich schätze es sehr und habe viel gelernt! Ich habe auch gelernt, dass ich so viel zu lernen habe und die Bücher schlagen werde.Meine Aufgabe wartet nicht auf die Fertigstellung

Ich versuche immer noch, den Hang von erwarten und async zu bekommen, so habe ich rumgemacht, aber ich bin jetzt ratlos. Ich habe viel gegoogelt, gelesen und recherchiert, aber ich kann das Problem nicht finden.

Also, was ich tue, ist Deserialisieren und zu versuchen, ein Objekt zurück

public static async Task<SomeObject> Deserialize(string filePath) 
    { 
     var task = Task.Factory.StartNew(() => LoadFile(filePath)); 

     await task; 

     return task.Result; 
    } 

Die oben beschriebene Methode dann hier genannt wird:

public async Task DoStuff() 
    { 
     var load = await Helper.Deserialize(Helper.filePath); 

     try 
     { 
      Console.WriteLine(load.GetType()); 
     } 
     catch(Exception e) 
     { 
      Console.WriteLine(e); 
     } 
    } 

Der Rest des Codes ausgeführt wird, bevor die Aufgabe abgeschlossen ist und das Objekt kommt immer als Null heraus und macht es unbrauchbar. Ich weiß, dass ich etwas falsch mache, aber ich kann nicht für mein Leben herausfinden, was es ist, selbst nachdem ich Stunden damit verbracht habe, beantwortete Fragen und die Microsoft-Dokumente zu lesen. Hier

@Fabio ist die Loadfile-Methode:

 private static SomeObject LoadFile(string path) 
    { 
     JsonSerializer json = new JsonSerializer(); 
     JsonTextReader reader = new JsonTextReader(new StreamReader(path)); 

     var obj = json.Deserialize(reader, typeof(SomeObject)); 
     reader.Close(); 

     return (SomeObject)obj; 
    } 
+1

Refactoring versuchen, die await Aufgabe zu entfernen, anstatt Aufgabe aus der deserialize func zurückzukehren. – Hybridzz

+1

Ich würde vorschlagen, 'LoadFile'' async' zu machen und '' async' 'Versionen der IO-Aufrufe zu erwarten. Was Sie tun, ist wirklich für CPU gebundenen Aufgaben gedacht https://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-using.html – juharr

+0

Können Sie 'LoadFile' Methode zeigen? – Fabio

Antwort

1

sollten Sie Task.Run anstelle von Task.Factory.StartNew

public static Task<SomeObject> DeserializeAsync(string filePath) 
{ 
    return Task.Run(() => LoadFile(filePath)); 
} 

unter der Annahme LoadFile kehrt SomeObject

Oder Sie können die LoadFile Methode

private static Task<SomeObject> LoadFileAsync(string path) { 
    return Task.Run(() => { 
     JsonSerializer json = new JsonSerializer(); 
     using(var reader = new JsonTextReader(new StreamReader(path))) { 
      var obj = json.Deserialize(reader, typeof(SomeObject)); 
      return (SomeObject)obj; 
     } 
    });   
} 

public static async Task<SomeObject> DeserializeAsync(string filePath) 
{ 
    var obj = await LoadFileAsync(filePath); 
    return obj; 
} 
+0

Okay, danke für die Antwort, ich versuche das gerade jetzt. – Acolytes

+0

Vielen Dank für die Post. Das hat mein Problem gelöst, ich schätze deine Zeit sehr. – Acolytes

+1

Die Code-Beispiele von OP sollten funktionieren, sogar mit 'Task.Factory.StartNew..' - aber natürlich ist' Task.Run' der richtige Weg, um Aufgaben zu erstellen. Tut mir leid, ich sehe nicht, warum das Umbrechen eines Codes in zwei Aufgaben ein Problem löst. Können Sie erklären? – Fabio

2

Versuchen Sie, diese

public static Task<SomeObject> Deserialize(string filePath) 
    { 
     var task = Task.Run(() => LoadFile(filePath)); 

     return task;  
    } 
Verwandte Themen