繁体   English   中英

C# HttpClient 异步等待 - 无法保证“A”在“B”之前

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

我正在尝试编写一个 C# 控制台应用程序,它使用 HttpClient 来抓取 web 页。 调用 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");
    }
}

您的FunctionTwoAsync方法是一种async方法,这意味着该方法是异步的。

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

因此,像这样更改您的代码:

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

要在 B 之前创建 A,您需要等待 FunctionTwoAsync 并使 FunctionOne 成为异步 function

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

    Console.WriteLine("B");
 }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM