J'essaie d'écrire une application console C # qui utilise HttpClient pour gratter des pages Web. Lorsque FunctionOne est appelé, quelle est la meilleure façon de s'assurer que "A" est écrit sur la console avant "B"? Chaque fois que j'exécute mon code, "B" est toujours écrit avant "A". Merci d'avance pour l'aide!
public class MyClass { public void FunctionOne(string url) { FunctionTwoAsync(url); Console.WriteLine("B"); } private async void FunctionTwoAsync(string url) { var httpClient = new HttpClient(); var htmlContent = await httpClient.GetStringAsync(url); var htmlDocument = new HtmlDocument(); htmlDocument.LoadHtml(htmlContent); Console.WriteLine("A"); } }
3 Réponses :
Pour faire de A avant B, vous devez attendre FunctionTwoAsync et faire de FunctionOne une fonction asynchrone
public async void FunctionOne(string url) { await FunctionTwoAsync(url); Console.WriteLine("B"); }
Votre méthode FunctionTwoAsync
est une méthode async
, cela signifie que cette méthode fonctionne de manière asynchrone.
Lorsque vous avez besoin du résultat de Methode ou ont besoin de cette finalise la méthode, vous devez être utiliser await
mot - clé pour async
méthode
Alors, changez votre code comme ceci:
public class MyClass { public async Task FunctionOne(string url) { await FunctionTwoAsync(url); Console.WriteLine("B"); } private async Task FunctionTwoAsync(string url) { var httpClient = new HttpClient(); var htmlContent = await httpClient.GetStringAsync(url); var htmlDocument = new HtmlDocument(); htmlDocument.LoadHtml(htmlContent); Console.WriteLine("A"); } }
Cela n'explique rien. Ce serait une meilleure réponse si vous expliquez quel est le problème et pourquoi ce code fonctionne
Cela a fonctionné, merci @ Mofid.Moghimi! J'ai associé votre exemple de solution au lien fourni par @Linus ci-dessus pour clarifier le «quoi» et le «pourquoi». Merci encore!
Vous devez rendre FunctionOne également asynchrone et attendre l'exécution de la deuxième fonction:
public class MyClass { public async Task FunctionOne(string url) { await FunctionTwoAsync(url); Console.WriteLine("B"); } private async Task FunctionTwoAsync(string url) { var httpClient = new HttpClient(); var htmlContent = await httpClient.GetStringAsync(url); var htmlDocument = new HtmlDocument(); htmlDocument.LoadHtml(htmlContent); Console.WriteLine("A"); } }
Une méthode async void
ne peut pas être attendue, car elle ne renvoie pas d'objet attendu, par exemple Task
.
Attention aux async void stackoverflow.com/questions/12144077/...