如何从父类调用异步任务?

时间:2015-03-07 23:39:08

标签: c# asp.net task

今天我需要你的帮助来调试我的代码......的确,我需要使用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];
    }

}

1 个答案:

答案 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模式将在整个代码中形成,并使所有这些模式更易于界面化,更易于编写。