异步方法
问题描述:
我在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()
。在使用正确的返回类型时有一点困难。
答
你还是做这种方式:
public async Task<string> GetData(int id)
{
string inp = await CommonMethod(id);
return inp;
}
你做你的第二个电话一样。 返回的值将自动包含在Task中。
因为你有Task作为你的返回类型,并且你已经在代码中手工将它打包在Task中,所以它在那里抛出一个错误。
答
当您向该方法添加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
之后的代码,并返回结果作为之前返回的原始任务的结果。
确切!甚至是'返回等待CommonMethod(id);' – Yasser