gpt4 book ai didi

c# - GetStringAsync 从不返回,执行异步 GET 的正确方法

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:11 24 4
gpt4 key购买 nike

我有一个控制台应用程序,用户输入一个字符串(一个数字,例如“1”),我根据输入的数字发出GET请求,并返回GET的字符串结果。

我想异步执行,因为一般来说,所有 I/O 操作都应该是异步的,所以我基本上想执行 GET,等待结果,然后返回字符串。

我的代码:

    public async Task<string> getClassName()
{
Task<string> myTask = getClassNameFromClassNamer();
// Do something here
string page = await myTask;
return page;
}

public async Task<string> getClassNameFromClassNamer() /
{
string url = "...";
using (var client = new HttpClient())
{
return await client.GetStringAsync(url);
}
}

现在,GetStringAsync 永远不会返回,cmd 窗口只会关闭。

我还尝试了 ConfigureAwait(continueOnCapturedContext: false);,但没有用。

当我尝试使用

result = httpClient.GetStringAsync("...").Result;

它起作用了,但我感觉它不是真正异步的..

我在 .NET 4.5 中工作

编辑:

调用方法:

    public async Task execFeature()
{
string response = await webApi.getClassName();
IResult result = new TextResult(response);
result.display();
}

和:

public async Task startService() 
{
....
await feature.execFeature();
}

在 Program.cs 中:

featureService.startService();

所以,我有两个问题:

  1. 对服务器执行异步 GET 的正确方法是什么?我想做 GET,获取字符串结果并返回字符串。

  2. 据我所知,每个 Web 请求都应该异步完成,因为我们希望应用程序中的其他代码(UI、逻辑)继续运行。尽管现在,我没有任何其他操作正在运行或其他 UI 保持响应(控制台应用程序),我基本上只是在等待服务器的响应,我觉得它很好练习异步执行请求。这听起来正确吗?

谢谢!

最佳答案

What is the proper way of doing an async GET to a server? I want to do the GET, get the string result and return the string.

你做得对。

要解决应用程序退出的问题,您必须像这样在 main 方法中同步等待顶级任务:

featureService.startService().Wait();

看看this reference .

I feel like its good practice to do the requests in async. Does that sound correct?

不是真的。在两种情况下异步执行 IO 调用是好的:

  • 在 UI 应用程序中,您不想绑定(bind) UI 线程来使 UI 响应。
  • 在您期望有大量请求的服务器端应用程序(例如 ASP.NET)中,您不希望在 IO 进行时绑定(bind)线程池线程。这是真的,因为从根本上说,IO 操作是真正异步的并且 do not require any thread .然而,“正常的”同步 IO 调用会不必要地绑定(bind)线程。因此,当我们使用异步 IO 调用时,我们会节省线程池线程,如果您有大量服务器请求,这些线程会很昂贵。

关于c# - GetStringAsync 从不返回,执行异步 GET 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36925852/

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