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