2016-09-16 6 views
4

Ich brauche eine Methode, die Code-Schnipsel kompiliert wieMethode, die Aufgabe liefert <string>

public static Task<string> AsyncTest() 
{  
    return new Task<string>(() => string.Empty); //problem here 

    // this method would work: 
    // return new WebClient().DownloadStringTaskAsync(@"http://www.google.de"); 
} 

public static void Workdl(string input) 
{ 
    Console.Write("OUT: " + input.Substring(0, 100)); 
} 

eine Task<string> mit leeren String zurückgibt, aber wenn ich es nennen wie

Task<string> dlTask = AsyncTest(); 
Workdl(await dlTask); 
await Task.WhenAll(dlTask); //Task never completes 

es bestimmt nie.

Antwort

14

Sofern Sie nicht Ihr eigenes Task-Management-System schreiben, sollten Sie wahrscheinlich nie new Task(...) verwenden.

Allerdings ist der Grund, warum dies in diesem Fall nicht funktioniert, weil ein new Task(...) nicht von selbst startet. Es erstellt nur das Aufgabenobjekt um Ihren Delegaten herum.

Sie sollten entweder explizit starten:

var t = new Task(() => string.Empty); 
t.Start(); 
return t; 

Oder einfach Task.Run statt:

return Task.Run(() => string.Empty); 

(dies meine Empfehlung wäre new Task(...) zu vermeiden, mit)

Jetzt, In diesem Fall würde ich etwas ganz anderes wählen.

Wenn Sie nicht wirklich die Aufgabe ausführen müssen, können Sie einfach eine bereits abgeschlossene Aufgabe um ein vorhandenes Ergebnis erstellen. Der Grund, warum ich sage "wenn" ist, dass Ihr Beispiel in der Frage für diese Frage verdummt werden könnte und Sie möglicherweise Code dort drin haben, in diesem Fall sollten Sie für den Code über diesem Absatz gehen. Allerdings, wenn Sie müssen einen asynchronen Methodensignatur halten, eine Aufgabe der Rückkehr aber brauchen nicht eigentlich eine Aufgabe zu drehen, dann tun:

return Task.FromResult(string.Empty); 

Dies einfach „beginnt bereits abgeschlossen“.

Verwandte Themen