簡體   English   中英

如何從父類調用異步任務?

[英]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)的返回。 你知道我該怎么解決嗎?

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來阻止async方法:

    var myTask = Get(url).Result;

(在這種情況下,顯然您不必將Geter()更改為async方法)。

但是我強烈不鼓勵這樣做。 如果使用正確,則async / await模式將在您的整個代碼中交織在一起,並使所有這些對用戶界面更友好,更易於編寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM