C# HttpClient Async-Await - 无法保证 'A' 在 'B' 之前

C# HttpClient Async-Await - Unable to Guarantee 'A' Before 'B'

我正在尝试编写一个使用 HttpClient 抓取网页的 C# 控制台应用程序。调用 FunctionOne 时,确保“A”先于“B”写入控制台的最佳方法是什么?每当我 运行 我的代码时,“B”总是写在“A”之前。在此先感谢您的帮助!

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

要在 B 之前创建 A,您需要等待 FunctionTwoAsync 并将 FunctionOne 设置为异步函数

 public async void FunctionOne(string url)
 {   
    await FunctionTwoAsync(url);

    Console.WriteLine("B");
 }

你的FunctionTwoAsync方法是一个async方法,这意味着这个方法是异步的。

当您需要方法的结果或需要此方法完成时,您必须使用 await 关键字用于 async 方法

所以,像这样更改您的代码:

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

您应该使 FunctionOne 也异步并等待第二个函数的执行:

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