C# HttpClient GetStringAsync Task 提前返回

本文关键字:返回 Task HttpClient GetStringAsync | 更新日期: 2023-09-27 18:31:55

我正在做一个 ASP.NET 项目,我正在使用我们创建的自定义 REST 服务来获取站点的 JSON 数据。 我正在使用HTTPClient来调用REST服务。 但是当我调用我在下面创建的 ProcessRestMethod 例程时,有时任务会返回正确的结果,但有时任务不会完成执行,例程会返回。 异步调用中缺少什么? 我的ProcessRestMethod代码如下。谢谢:

private string ProcessRestMethod(string methodName, string parameters)
{
    string result = "";
    using (HttpClient httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        string strParams = parameters;
        if ((!String.IsNullOrEmpty(parameters)) && (parameters.IndexOf('?') != 0))
            strParams = "?" + parameters;

        var task = httpClient.GetStringAsync(baseUri + methodName + strParams);
        task.Wait();
        task.ContinueWith((t) =>
        {
            var tresult = t.Result;
            result = tresult;
        });
    }
    if (result == "")
        result = "{'"status'":{'"code'":1000,'"message'":'"Unkown Error Ocured'"}}";
    return result;
}

C# HttpClient GetStringAsync Task 提前返回

您需要做的就是获取任务的 Result 属性 - 这将等待它完成并返回结果。

您之前所做的是启动"延续"任务以获得结果。这将导致在不同的线程中获取结果,因此您具有所描述的争用条件。

  private string ProcessRestMethod(string methodName, string parameters)
  {
        string result = "";
        using (HttpClient httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            string strParams = parameters;
            if ((!String.IsNullOrEmpty(parameters)) && (parameters.IndexOf('?') != 0))
                strParams = "?" + parameters;

            var task = httpClient.GetStringAsync(baseUri + methodName + strParams);
            // Just call `task.Result` here :)
            result = task.Result;
        }
        if (result == "")
            result = "{'"status'":{'"code'":1000,'"message'":'"Unkown Error Ocured'"}}";
        return result;
    }

使用以下方法尝试以下操作

异步/等待

    private async Task<string> ProcessRestMethod(string methodName, string parameters)
    {
        string result = "";
        using (HttpClient httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            string strParams = parameters;
            if ((!String.IsNullOrEmpty(parameters)) && (parameters.IndexOf('?') != 0))
                strParams = "?" + parameters;

            result = await httpClient.GetStringAsync(baseUri + methodName + strParams);
        }
        if (result == "")
            result = "{'"status'":{'"code'":1000,'"message'":'"Unkown Error Ocured'"}}";
        return result;
    }

您可以在此处阅读有关任务,异步和等待的更多信息https://www.simple-talk.com/dotnet/.net-tools/c-async-what-is-it,-and-how-does-it-work/http://www.dotnetperls.com/async重要的是,这个解释了最好的https://msdn.microsoft.com/library/hh191443.aspx