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

C#HttpClient Async wait-无法保证';A';在'之前;B';,c#,async-await,console-application,httpclient,C#,Async Await,Console Application,Httpclient,我正在尝试编写一个C#控制台应用程序,它使用HttpClient刮取网页。调用FunctionOne时,确保在“B”之前将“A”写入控制台的最佳方法是什么?每当我运行代码时,“B”总是写在“A”之前。提前感谢您的帮助 public class MyClass { public void FunctionOne(string url) { FunctionTwoAsync(url); Console.WriteLine("B&quo

我正在尝试编写一个C#控制台应用程序,它使用HttpClient刮取网页。调用FunctionOne时,确保在“B”之前将“A”写入控制台的最佳方法是什么?每当我运行代码时,“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");
    }
}

要使A在B之前,您需要等待FunctionTwoAsync并使FunctionOne成为异步函数

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

    Console.WriteLine("B");
 }

您的
functiontwoancy
方法是一个
async
方法,这意味着该方法是异步工作的

当您需要methode的结果或需要此方法完成时,必须使用
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");
    }
}

注意async void,这解释不了什么。如果您能解释问题所在以及代码工作的原因,这将是一个更好的答案。谢谢@Mofid.Moghimi!我将你们的样品溶液和上面提供的@Linus配对,以明确“什么”和“为什么”。再次感谢!无法等待
异步void
方法,因为它不返回可等待的对象,例如
任务