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

问题描述 投票:0回答:3

我有一个控制台应用程序,用户输入一个字符串(一个数字,例如“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. 据我所知,每个网络请求都应该异步完成,因为我们希望应用程序中的其他代码(UI、逻辑)继续运行。即使现在,我没有运行任何其他操作或其他 UI 来保持响应(控制台应用程序),而且我基本上只是在等待服务器的响应,我觉得执行请求是一个很好的做法在异步中。听起来正确吗?

谢谢!

c# asynchronous get async-await task
3个回答
4
投票
对服务器进行异步 GET 的正确方法是什么?我想做 GET,获取字符串结果并返回字符串。

你做对了。

要解决应用程序退出的问题,您必须在

main

 方法中同步等待顶级任务,如下所示:

featureService.startService().Wait();

看看

此参考资料

我觉得异步执行请求是一个很好的做法。听起来正确吗?

其实不然。异步进行 IO 调用有两种情况:


2
投票
我认为问题在于你实际上并没有归还你想要的东西。您想要获取异步调用的结果。你会做这样的事情:

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

-2
投票
我遇到了完全相同的问题。

添加ConfigureAwait(false)对我来说很有效。

var response = await HttpClient.GetStringAsync(url).ConfigureAwait(false);
    
© www.soinside.com 2019 - 2024. All rights reserved.