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;
}
您需要做的就是获取任务的 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