如何从父 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 友好且更易于编写。