[英]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.