gpt4 book ai didi

c# - HttpClient 中的 GetAsync 无法按预期工作

转载 作者:行者123 更新时间:2023-12-02 04:22:04 25 4
gpt4 key购买 nike

我不熟悉async/await到底是如何工作的。为了更好地理解它,我创建了下面的示例代码:

    static void Main(string[] args)
{
GetAPI();
Console.WriteLine("Hello");
Console.ReadLine();
}

public static async void GetAPI()
{
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Get", "application/json");

var response = await client.GetAsync("http://somelinks");

string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
Console.ReadLine();
}
}

GetAPI() 方法基本上会调用一个 API,该 API 以 Json 格式返回一些内容。然而,我收到的输出令人惊讶,尽管首先调用了 GetAPI(),但控制台中首先打印了“Hello”。当我设置调试器时,在我看来,在它命中 GetAPI() 中的 await 后,它将返回到 Main .

如何先打印 API 中的内容?换句话说,如何确保程序首先执行完 GetAPI() 中的所有内容?

其他信息:

  1. 我被迫使用 async/await,因为 HttpClient 仅提供 GetAsync 方法。
  2. 我无法在 Main 中使用 async/await。它给我一个错误,提示 Error 1 'ConsumeWebApi.Program.Main(string[])': an Entry point can be tagged with the 'async' modifier

最佳答案

您有几个选项,都可以为您提供所需的行为:

  • 将您的 GetAPI 方法更改为非异步方法,然后像以前一样调用它

如果您的目标只是使此调用同步,以便您的 console.write 打印以便您可以从方法声明中删除异步,则不要使用 wait 并执行 .result ,如下所示:

    private void LoadData()
{
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));


var response = client.GetAsync("http://somelinks").Result;

string content = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(content);
Console.ReadLine();
}
}

此外,您请求 json 的 http header 不正确,您有一个名为“get”的 header 。

  • 将方法保留为异步并返回任务,并在从控制台应用调用该方法时使用 .Wait() 使其完成。

如果您想让调用异步,您需要从异步方法调用它或使用 wait 等待它完成。通常,在事件处理程序中,您只需将事件处理程序标记为异步,并确保从异步方法返回任务类型。

在像您的情况这样的控制台程序中,您可以等待异步方法。您需要从异步方法返回类型为 Task 的类型,而不是像您那样 void ,以便能够等待它。这将允许您等待异步方法完成,然后再完成并移至 WriteLine。通过这样做,它将有效地同步,并且两种方法在您的控制台应用程序中的行为将相同。

 static void Main(string[] args)
{
Console.WriteLine("here");
LoadData().Wait();
Console.WriteLine("there");
}

static async private Task LoadData()
{
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

var response = await client.GetAsync("http://somelinks");

string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
Console.ReadLine();
}
}

一般来说,最好将方法保留为异步,因为如果您将其移至由某个程序使用的共享库,该程序可以从该方法在您需要的地方异步并在您需要的地方同步中受益就像在你的控制台应用程序中一样。您最终能够做到这一点。

关于c# - HttpClient 中的 GetAsync 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29705607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com