-1
votes

C # HttpClient Async-Await - Impossible de garantir «A» avant «B»

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


1 commentaires

Attention aux async void stackoverflow.com/questions/12144077/...


3 Réponses :


0
votes

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


0 commentaires

2
votes

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


2 commentaires

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!



0
votes

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


1 commentaires

Une méthode async void ne peut pas être attendue, car elle ne renvoie pas d'objet attendu, par exemple Task .