Comment dois-je attendre jusqu'à ce que la Tâche est terminée en C#?
Je veux envoyer une requête à un serveur et des processus la valeur retournée:
private static string Send(int id)
{
Task<HttpResponseMessage> responseTask = client.GetAsync("aaaaa");
string result = string.Empty;
responseTask.ContinueWith(x => result = Print(x));
responseTask.Wait(); //it doesn't wait for the completion of the response task
return result;
}
private static string Print(Task<HttpResponseMessage> httpTask)
{
Task<string> task = httpTask.Result.Content.ReadAsStringAsync();
string result = string.Empty;
task.ContinueWith(t =>
{
Console.WriteLine("Result: " + t.Result);
result = t.Result;
});
task.Wait(); //it does wait
return result;
}
Suis-je à l'aide de Task
correctement? Je ne le pense pas parce que le Send()
méthode renvoie string.Empty
à chaque fois, alors que Print
renvoie la valeur correcte.
Ce que je fais mal? Comment puis-je obtenir le résultat correct à partir d'un serveur?
Vous devez vous connecter pour publier un commentaire.
Votre méthode d'Impression probablement besoin d'attendre de la continuation de finition (ContinueWith renvoie une tâche que vous pouvez attendre sur). Sinon, la deuxième ReadAsStringAsync finitions, la méthode renvoie (avant résultat est attribué dans la suite). Même problème existe dans votre méthode d'envoi. Les deux besoin d'attendre à la poursuite de toujours obtenir les résultats que vous voulez. Similaire à ci-dessous
Il attend
client.GetAsync("aaaaa");
, mais ne pas attendre pourresult = Print(x)
Essayer
responseTask.ContinueWith(x => result = Print(x)).Wait()
--EDIT--
Code ci-dessus n'est pas garantie de la sortie:
Mais ce n' (voir la
newTask
)task.Wait()
vous attendez l'originalTask
, pas celui que vous avez créé avecContinueWith
responseTask.Wait()
avantnewTask.Task()
?ContinueWith
garantira tâche précédente est terminée.Je suis un async novice, donc je ne peux pas vous dire définitivement ce qui se passe ici. Je soupçonne qu'il y a un décalage dans l'exécution de la méthode des attentes, même si vous utilisez des tâches à l'interne dans les méthodes. Je pense que vous obtiendrez les résultats que vous attendez si vous avez changé d'Impression de revenir d'une Tâche<string>:
Lorsque l'on travaille avec les continuations je trouve qu'il est utile de penser à l'endroit où je vous écris .ContinueWith comme le lieu d'exécution qui reprend immédiatement les déclarations suivantes, de ne pas les déclarations de "l'intérieur" il. Dans ce cas, il devient évident que vous obtenez une chaîne vide est retournée en Envoyer. Si votre seul traitement de la réponse est de l'écrire dans la console, vous n'avez pas besoin d'Attendre dans l'Oti solution - la console d'impression, l'impression se fera sans l'attend, mais à la fois Envoyer et Imprimer doit retourner nulle dans ce cas. Exécutez cette application console et vous aurez l'impression de la page.
L'OMI, de l'attente et de la Tâche.Résultat des appels (le bloc) sont nécessaires parfois, en fonction de votre choix de flux de contrôle, mais le plus souvent ils sont un signe que vous n'avez pas vraiment l'utilisation asynchrone fonctionnalité correctement.
Un exemple propre qui répond au Titre