簡體   English   中英

異步方法的返回類型

[英]Return Type of an async method

我在C#中有一個異步方法,如下所示:

public async Task<string> GetData(int id)
        {
        Task<string> inp =  CommonMethod(id);
        return inp;
}

  public async Task<string> CommonMethod(int id)
        {
        string output ;
        output = await service.GetSomeDummyData(id);
        return output;
}

我收到一條錯誤消息,因為“由於這是一個異步方法,所以返回表達式必須是字符串類型,而不是'Task'類型

所以,我將返回類型轉換為:

public async Task<string> GetData(int id)
        {
        Task<string> inp =  CommonMethod(id);
        return inp.ToString();
}

該代碼已成功編譯。

我是異步編程的新手,以上轉換方法是返回字符串的最佳實踐嗎? 因為從CommonMethod中 ,我將在Task<string>收集返回類型,而在下inp.Tostring()語句中,我將使用inp.Tostring() 使用正確的返回類型有點困難。

當您將async修飾符添加到方法中時,您是在告訴編譯器自動將其返回值包裝為Task。 或者說,一系列任務在每個await語句上彼此連續,松散地說。 所以你的代碼:

public async Task<string> GetData(int id)
{
    Task<string> inp =  CommonMethod(id);
    return inp;
}

會編譯成類似以下內容的東西:

public Task<string> GetData(int id)
{
     return Task.Run() => 
     {
         Task<string> inp =  CommonMethod(id);
         return inp; 
     }
}

因此,您要返回的內容不是Task<string> ,而是Task<Task<string>> -一個返回另一個Task(然后返回字符串)的Task,該Task與方法簽名不匹配。

因此,您要做的就是刪除async修飾符並直接返回內部任務:

public Task<string> GetData(int id)
{
    Task<string> inp =  CommonMethod(id);
    return inp;
} 

它將起作用,並返回內部CommonMethod任務,或者添加內部await語句以在內部任務的結果之上返回一個新Task:

public async Task<string> GetData(int id)
{
    string inp =  await CommonMethod(id);
    return inp;
}

它再次寬松地在到達await語句時立即返回任務, 其后的代碼( return語句)位於內部任務的ContinueWith塊中。 內部任務完成后, await代碼將運行,並返回結果作為先前返回的原始Task的結果。

您應該這樣做:

public async Task<string> GetData(int id)
{
    string inp = await CommonMethod(id);
    return inp;
}

與您在第二個通話中使用的方法相同。 返回的值將自動包裝在Task中。

因為您將Task作為返回類型,並且已在代碼中手動將其打包在Task中,所以它在此處引發了錯誤。

暫無
暫無

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

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