我有这个代码:
private class TResponse
{
public bool IsSuccessful { get; set; }
public string ErrorCode { get; set; }
public string ErrorMessage { get; set; }
}
var response = client.PostAsJsonAsync(methodName, data).Result;
TResponse result = default(TResponse);
var responseString = response.Content.ReadAsStringAsync().Result;
if (responseString.CompareTo("null") != 0)
result = response.Content.ReadAsAsync<TResponse>().Result;
在此代码中结果为空。但如果我以其他方式写这个结果将有价值!:
var responseContent = response.Content.ReadAsStringAsync();
result = JsonConvert.DeserializeObject<TResponse>(responseContent.Result.ToString());
为什么第一个代码不起作用?我将其用于许多实体类型,但对于 TResponse 不起作用。
response.Content.ReadAsStringAsync() 返回 "{"IsSuccessful":false,"ErrorCode":"8","ErrorMessage":"XXXXXXxxxxsssssss."}"
您正在启动一个异步任务。这就是 Async 以
ReadAsAsync
的名称所暗示的内容。因此,您无需等待它完成即可运行它,这允许您的程序在等待结果的同时完成其他操作。但您还尝试在操作完成之前推断操作的结果。如果您想将调用与结果同步,您可以await
,例如
result = await response.Content.ReadAsAsync<TResponse>();
在此处了解更多信息:https://rules.sonarsource.com/csharp/tag/async-await/RSPEC-3168/