web-dev-qa-db-fra.com

Méthode qui renvoie la tâche <chaîne>

J'ai besoin d'une méthode qui renvoie un Task<string> avec une chaîne vide comme

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));
}

Cet extrait se compile mais quand je l'appelle comme

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

il ne détermine jamais.

11
c0rd

À moins que vous n'écriviez votre propre système de gestion des tâches, vous ne devriez probablement jamais utiliser new Task(...).

Cependant, cela mis à part, la raison pour laquelle cela ne fonctionne pas dans ce cas est parce qu'une new Task(...) ne démarre pas d'elle-même. Il construit simplement l'objet de tâche autour de votre délégué.

Vous devez soit le démarrer explicitement:

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

Ou utilisez simplement Task.Run À la place:

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

(ce serait ma recommandation pour éviter d'utiliser new Task(...))

Maintenant, dans ce cas, j'irais pour quelque chose de complètement différent.

Si vous n'avez pas réellement besoin de exécuter la tâche, vous pouvez simplement créer une tâche déjà terminée autour d'un résultat existant. La raison pour laquelle je dis "si" est que votre exemple dans la question peut être abrégé pour le bien de cette question et que vous pouvez en fait avoir du code dedans, auquel cas vous devriez opter pour le code au-dessus de ce paragraphe. Cependant, si vous devez adhérer à une signature de méthode asynchrone renvoyant une tâche mais n'a pas réellement besoin de faire tourner une tâche, alors faites ceci:

return Task.FromResult(string.Empty);

Cela "commence tout simplement déjà terminé".

28

Vous pouvez utiliser Task.FromResult ()

return Task.FromResult(string.Empty);
14
Scott Perham