我在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;
}
我收到错误消息为&#34;由于这是异步方法,因此返回表达式必须是字符串而不是&#39;任务&#39;
所以,我将返回类型转换为:
public async Task<string> GetData(int id)
{
Task<string> inp = CommonMethod(id);
return inp.ToString();
}
代码已成功编译。
我是异步编程的新手,上面的转换方法是返回字符串的最佳做法吗?因为来自 CommonMethod ,
我正在收集Task<string>
中的返回类型,并在下一个语句中使用inp.Tostring()
。使用正确的返回类型的一点困境。
答案 0 :(得分:4)
将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,它与方法签名不匹配。
所以你要做的就是删除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;
}
再次松散地,当达到await语句时,立即返回任务,其后面的代码(return
语句)位于ContinueWith
块上方内部任务。内部任务完成后,await
之后的代码将运行,并将结果作为先前返回的原始任务的结果返回。
答案 1 :(得分:3)
你应该这样做:
public async Task<string> GetData(int id)
{
string inp = await CommonMethod(id);
return inp;
}
与第二次通话中的方式相同。 返回的值将自动包含在Task中。
因为你有一个Task作为你的返回类型,并且你已经在你的代码中手动将它打包在任务中,所以它在那里引发了一个错误。