今天我需要你的帮助来调试我的代码......的确,我需要使用Task对象进行API调用,但它不起作用。
我的RestClient执行我的get / post / put请求:
public class RestClient
{
public HttpClient HttpClient { get; set; }
public RestClient()
{
if(HttpClient == null)
{
HttpClient = new HttpClient();
}
}
protected async Task<string> Get(string url)
{
// Call url in thread
HttpResponseMessage response = await HttpClient.GetAsync(url);
// Get content
var content = await response.Content.ReadAsStringAsync();
return content;
}
}
这个问题在这里,我无法获得base.Get(url)的返回。你知道我怎么解决这个问题吗?
class CarEnergy : RestClient
{
public CarEnergy Geter(int id)
{
string url = String.Format(Configuration.Configuration.GetCarEnergy, id);
Debug.WriteLine(url);
// Wait the get request before continue
var myTask = base.Get(url); // Impossible to get the return, it bug
Debug.WriteLine(result);
var carEnergy = JsonConvert.DeserializeObject<List<CarEnergy>>(result);
return carEnergy[0];
}
}
答案 0 :(得分:0)
您的Get()
方法为async
,因此您必须以某种方式等待结果。最好的方法是使用await
。这意味着您的Geter()
方法也需要async
,其来电者需要await
,依此类推。
另请注意,Get()
方法既不是虚拟方法也不是隐藏方式,因此您无需使用base
来调用它。
将上述结果修改为如下所示:
public async Task<CarEnergy> Geter(int id)
{
string url = String.Format(Configuration.Configuration.GetCarEnergy, id);
Debug.WriteLine(url);
// Wait the get request before continue
var myTask = await Get(url);
Debug.WriteLine(result);
var carEnergy = JsonConvert.DeserializeObject<List<CarEnergy>>(result);
return carEnergy[0];
}
如果必须,您可以通过简单地检索Result
属性而不是使用await
来阻止异步方法:
var myTask = Get(url).Result;
(在这种情况下,显然您不必将Geter()
更改为async
方法。
但我 强烈 不鼓励这样做。如果使用得当,async
/ await
模式将在整个代码中形成,并使所有这些模式更易于界面化,更易于编写。