C#HttpClient Async wait-无法保证';A';在'之前;B';
我正在尝试编写一个C#控制台应用程序,它使用HttpClient刮取网页。调用FunctionOne时,确保在“B”之前将“A”写入控制台的最佳方法是什么?每当我运行代码时,“B”总是写在“A”之前。提前感谢您的帮助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
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
方法,因为它不返回可等待的对象,例如任务
。