2017-05-05 7 views
-1

Ich verwende eine , die von System.IO.File.OpenText(string path) zurückgegeben wird, um eine asynchrone Volltextdatei zu erhalten, die Task über seine Task<string> ReadToEndAsync() Methode liest;Wie erhalte ich eine Aufgabe ähnlich der, die StreamReader.ReadToEndAsync() zurückgibt, aber nicht standardmäßig gestartet wird?

Soweit ich sehen kann, gibt es eine gestartete Aufgabe, ähnlich wie TaskFactory.StartNew(...);

Was könnten einige nette Möglichkeiten sein, um eine Task identische durch das Ergebnis zu erhalten, obwohl es schlummernd erzeugt, bis ein expliziterer Weg begann?

+2

Die Aufgabe, die es retruns ist nicht wie 'StartNew', tun' StartNew' wird einen neuen Thread starten. 'ReadToEndAsync' ist viel näher an die Rückgabe von etwas ähnlich einem [TaskCompletationSource .Task'] (https://msdn.microsoft.com/en-us/library/dd449187 (v ​​= vs.110) .aspx). –

Antwort

3

Der normale Weg, dies zu tun, ist eine Func<Task<String>> Delegate, um den Start der Aufgabe zu verzögern.

public Func<Task<string>> ReadToEndLater(string path) 
{ 
    return async() => 
    { 
     using(var file = System.IO.File.OpenText(path)) 
     { 
      return await file.ReadToEndAsync(); 
     } 
    } 
} 

Gebraucht wie

var readLater = ReadToEndLater(somePath); 
//do stuff 

var someText = await readLater(); 

Die Aufgabe (im => { ... } wird ausgeführt in der Tat nichts) nicht beginnen, bis Sie () auf dem zurück Delegierten nennen.

Verwandte Themen