Asp.net mvc 分离数据检索代码后异步请求不工作

Asp.net mvc 分离数据检索代码后异步请求不工作,asp.net-mvc,asynchronous,asp.net-web-api,async-await,Asp.net Mvc,Asynchronous,Asp.net Web Api,Async Await,我试图在查询webapi后显示一些结果,如下所示- public async Task<ActionResult> Get() { string _address = "someurl"; string results = null; HttpClient client = new HttpClient(new OAuthMessageHandler(new HttpClientHandler())); Htt

我试图在查询webapi后显示一些结果,如下所示-

public async Task<ActionResult> Get()
    {
        string _address = "someurl";
        string results = null;

        HttpClient client = new HttpClient(new OAuthMessageHandler(new HttpClientHandler()));
        HttpResponseMessage responseTask = await client.GetAsync(_address);

        if (responseTask.IsSuccessStatusCode)
        {
            results = await responseTask.Content.ReadAsStringAsync();
        }

        ResultModel model = JsonConvert.DeserializeObject<ResultModel>(results);

        return View(model);
    }
公共异步任务Get() { 字符串_address=“someurl”; 字符串结果=null; HttpClient客户端=新的HttpClient(新的OAuthMessageHandler(新的HttpClientHandler()); HttpResponseMessageResponseTask=等待客户端.GetAsync(_地址); if(响应任务IsSuccessStatusCode) { 结果=wait responseTask.Content.ReadAsStringAsync(); } ResultModel model=JsonConvert.DeserializeObject(结果); 返回视图(模型); } 这段代码运行良好,我能够从“someurl”url读取结果。现在,当我像下面那样重构代码时(通过将异步数据检索移动到另一个函数),它停止工作。它永远需要查询,并且不会返回任何结果。这是因为死锁还是我没有正确使用异步

public ActionResult Get()
{
        string _address = "someurl";
        Task<string> results = HttpClientService.HttpClientService.GetRequest(_address);

        IEnumerable<ResultModel> model  = JsonConvert.DeserializeObject<IEnumerable<ResultModel>>(results.Result);

        return View(model);
}

public static class HttpClientService
{
    public static async Task<string> GetRequest(string Url)
    {
        HttpClient client = new HttpClient(new OAuthMessageHandler(new HttpClientHandler()));
        HttpResponseMessage responseTask = await client.GetAsync(Url);

        if (responseTask.IsSuccessStatusCode)
        {
            return await responseTask.Content.ReadAsStringAsync();

        }
        else
        {
            return "Sorry buddy, cannot retrieve the requested data!";
        }
    }
}
public ActionResult Get()
{
字符串_address=“someurl”;
任务结果=HttpClientService.HttpClientService.GetRequest(_地址);
IEnumerable model=JsonConvert.DeserializeObject(results.Result);
返回视图(模型);
}
公共静态类HttpClientService
{
公共静态异步任务GetRequest(字符串Url)
{
HttpClient客户端=新的HttpClient(新的OAuthMessageHandler(新的HttpClientHandler());
HttpResponseMessageResponseTask=wait client.GetAsync(Url);
if(响应任务IsSuccessStatusCode)
{
return wait-responseTask.Content.ReadAsStringAsync();
}
其他的
{
return“抱歉,伙计,无法检索请求的数据!”;
}
}
}

请让我知道我做错了什么。我不熟悉异步实现。

您应该等待GetRequest方法。否则,您将无法实现异步处理的目的,即释放线程以便它可以执行其他工作。在这种情况下,当您通过results.result请求结果时,仍然会阻塞线程

public async Task<ActionResult> Get()
{
        string _address = "someurl";
        string results = await HttpClientService.HttpClientService.GetRequest(_address);

        IEnumerable<ResultModel> model  = JsonConvert.DeserializeObject<IEnumerable<ResultModel>>(results);

        return View(model);
}
公共异步任务Get() { 字符串_address=“someurl”; 字符串结果=等待HttpClientService.HttpClientService.GetRequest(_地址); IEnumerable model=JsonConvert.DeserializeObject(结果); 返回视图(模型); }
坦率地说,我不知道为什么您的代码没有返回,但即使它工作正常,以这种方式执行异步请求也是毫无意义的。

我更改如下-返回类型为--async任务调用方法为--string results=wait HttpClientService.HttpClientService.GetRequest(_address);这个很好用。我想知道您所说的“即使它工作正常,以这种方式执行异步请求也是毫无意义的”是什么意思。请告诉我您的想法是什么?在Web应用程序(我假设这是一个Web应用程序)中使用异步的目的是在等待异步操作的结果时释放执行线程来执行其他事情。当您请求异步操作的.Result时,线程将阻塞(而不是执行其他操作),直到异步操作完成。基本上,您是以一种更复杂的方式同步进行操作的。我明白您的意思,但我担心的是,当我已经返回as-return wait responseTask.Content.ReadAsStringAsync();,时,为什么我要在通话声明中再次等待?这样写异步真的不对吗?我必须把它放在一个单独的方法中,因为我从几个不同的地方调用它。有没有更好的方法来实现这一点?很抱歉,我不熟悉异步,但我需要理解这一点。他们对异步的说法是,当你做异步时,它一直都是异步的。这意味着异步操作(以及相应的等待)将通过所有层。这对于web应用程序和桌面应用程序都是如此,因为您想要释放的线程位于顶层。在您的情况下,一个请求得到一个线程,该线程请求异步发生某些事情,并继续执行,直到它在等待结果时命中.Result。您希望线程立即停止并将任务存储在某个位置,并在任务完成后继续。我想这是有道理的。因此,我将在任务对象中分配函数调用的结果,并继续工作,然后等待该对象检索值。非常感谢斯蒂尔加。