如何从父 class 调用异步任务?
How to call async task from parent class?
今天我需要你的帮助来调试我的代码...确实,我需要使用 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) 的 return。你知道我该如何解决这个问题吗?
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];
}
}
您的 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
模式将贯穿您的代码,并使所有代码更加 UI 友好且更易于编写。
今天我需要你的帮助来调试我的代码...确实,我需要使用 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) 的 return。你知道我该如何解决这个问题吗?
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];
}
}
您的 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
模式将贯穿您的代码,并使所有代码更加 UI 友好且更易于编写。