2016-11-21 113 views
0

我在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; 
} 

我得到的錯誤消息作爲「。由於這是一個異步的方法,所述返回表達式必須是字符串類型的而不是「任務」

SO,我轉換作爲返回類型:

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

的代碼被成功地得到遵守

我是新來的異步編程,是上面的轉換方法是返回字符串的最佳做法嗎?因爲從CommonMethod, 我收集返回類型Task<string>,並在下一個聲明我使用inp.Tostring()。在使用正確的返回類型時有一點困難。

回答

3

你還是做這種方式:

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

你做你的第二個電話一樣。 返回的值將自動包含在Task中。

因爲你有Task作爲你的返回類型,並且你已經在代碼中手工將它打包在Task中,所以它在那裏拋出一個錯誤。

+2

確切!甚至是'返回等待CommonMethod(id);' – Yasser

1

當您向該方法添加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>> - 返回另一個任務的任務(然後返回字符串),這與方法簽名不匹配。

所以,你想要做什麼或者是下降的async改性劑和直接返回內部任務:

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

將正常工作,並返回內部CommonMethod任務,或添加內部await語句返回在內部任務的結果的新任務:

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

這又鬆散,返回任務立即當等待語句在塊之後的代碼(return語句)之後的代碼被覆蓋到內部任務上。內部任務完成後,運行await之後的代碼,並返回結果作爲之前返回的原始任務的結果。