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

时间:2016-04-28 21:33:07

标签: c# asynchronous get async-await task

我有一个控制台应用程序,用户输入一个字符串(例如一个数字,“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保持响应(控制台应用程序),我基本上只是等待来自服务器的响应,我觉得它很好练习在异步中执行请求。这听起来不错吗?

  3. 谢谢!

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

  

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

你正确地做到了。

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

featureService.startService().Wait();

看看this reference

  

我认为在异步中执行请求是一种很好的做法。这听起来不错吗?

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

  • 在UI应用程序中,您不希望绑定UI线程以使UI响应。
  • 在您期望大量请求的服务器端应用程序(例如ASP.NET)中,您不希望在IO正在进行时绑定线程池线程。这是事实,因为从根本上说,IO操作是真正的异步和do not require any thread。然而,&#34;正常&#34;同步IO调用会不必要地绑定线程。因此,当我们使用异步IO调用时,如果您有大量服务器请求,我们会保存昂贵的线程池线程。

答案 2 :(得分:-2)

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

添加ConfigureAwait(false)对我有用。

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