繁体   English   中英

c# - GetStringAsync 永远不会返回,正确的异步 GET 方法

[英]c# - GetStringAsync never returns, proper way of doing async GET

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

我想在async中做,因为一般情况下所有的I/O操作都应该在async中,所以我基本上想做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 来保持响应(控制台应用程序),而且我基本上只是在等待来自服务器的响应,我觉得以异步方式执行请求是一种很好的做法. 这听起来正确吗?

谢谢!

我认为问题在于你实际上并没有返回你想要的东西。 您想获得异步调用的结果。 你会做这样的事情:

var httpClient = new HttpClient();
var uri = "http://some.api.url;
var response = await httpClient.GetAsync(uri);

if (response.IsSuccessStatusCode)
{
    var content = await response.Content.ReadAsStringAsync();

    return content;
}

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

你做得对。

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

featureService.startService().Wait();

看看这个参考

我觉得以异步方式处理请求是一种很好的做法。 这听起来正确吗?

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

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

我遇到了完全相同的问题。

添加 ConfigureAwait(false) 对我有用。

var response = await HttpClient.GetStringAsync(url).ConfigureAwait(false);

暂无
暂无

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

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